JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

1. 自己列挙可能なプロパティ

Object.keys()メソッドは、指定されたオブジェクトの列挙可能なプロパティの配列を返します。配列内のプロパティ名の順序はfor...inループを使用してオブジェクトを反復処理するときに返される順序と同じです。オブジェクトのキーと値のペアが列挙可能でない場合は、キーの配列が返されます。

これは合理的です。なぜなら、ほとんどの場合、オブジェクト自体のプロパティのみを気にする必要があるからです。

オブジェクトに独自のプロパティと継承されたプロパティの両方があり、 Object.keys()独自のプロパティ キーのみを返す例を見てみましょう。

simpleColors = {とする
  色A: '白'、
  色B: '黒'
};
natureColors = {とします
  colorC: '緑'、
  色D: '黄色'
};
Object.setPrototypeOf(natureColors、simpleColors);
Object.keys(natureColors); // => ['colorC', 'colorD']
natureColors['colorA']; // => 'white'
natureColors['colorB']; // => '黒'

Object.setPrototypeOf()メソッドは、指定されたオブジェクトのプロトタイプ (つまり、内部の [[ Prototype ]] プロパティ) を別のオブジェクトまたは null に設定します。

Object.keys (natureColors) はnatureColorsオブジェクト自身の列挙可能なプロパティ キー [‘colorC’, ‘colorD’] を返します。

natureColorsにはsimpleColorsプロトタイプ オブジェクトから継承されたプロパティが含まれていますが、Object.keys() 関数はそれらをスキップします。

Object.values()Object.entries()も、指定されたオブジェクトの列挙可能なプロパティのキーと値のペアの配列を返します。

// ...
オブジェクト。値(natureColors)。 
// => ['緑', '黄']
オブジェクト.entries(natureColors);
// => [ ['colorC', '緑'], ['colorD', '黄'] ]

ここで、 for..inステートメントとの違いに注意してください。 for..in 、自身のプロパティをループできるだけでなく、プロトタイプ チェーン内のプロパティを列挙することもできます。

// ...
enumerableKeys = [] とします。
for (let key in natureColors) {
  enumerableKeys.push(キー);
}
enumerableKeys; // => ['colorC', 'colorD', 'colorA', 'colorB']

enumerableKeys配列には、 natureColors独自のプロパティ キー「colorC」と「colorD」が含まれています。

さらに、for..inはsimpleColorsプロトタイプオブジェクトから継承されたプロパティも走査します。

2. Object.values()はプロパティ値を返します

**Object.values()**メソッドはfor...inループを使用する場合と同じ順序で、指定されたオブジェクトのすべての列挙可能なプロパティ値の配列を返します (違いは、for-in ループがプロトタイプ チェーン内のプロパティを列挙することです)。

たとえば、Object.keys() を使用してキーを収集し、そのキーを使用してオブジェクトから対応する値を取得します。

食事 = {
  食事A:「朝食」
  食事B: 「ランチ」
  食事C:「夕食」
};
for (let key of Object.keys(meals)) {
  mealName = 食事[キー]とします。
  // ... mealName を使って何かする
  console.log(食事名);
}
// 「朝食」「昼食」「夕食」

食事は単純な物体です。 Object.keys(meals)と列挙型の for..of ループを使用して、オブジェクト キーの値を取得します。

コードは単純に見えますが、 let mealName = meals[key]必要ではなく、次のようにさらに最適化できます。

食事 = {
  食事A:「朝食」
  食事B: 「ランチ」
  食事C:「夕食」
};
for (let mealName of Object.values(meals)) {
  console.log(食事名);
}
// 「朝食」「昼食」「夕食」

Object.values(meals)オブジェクトのプロパティ値を配列で返すため、 for..ofで直接簡略化できます。 mealNameループ内で直接割り当てられます。

3. オブジェクト.entries()

Object.entries()メソッドは、指定されたオブジェクト自身の列挙可能なプロパティのキーと値のペアの配列を返します。この配列は、for...in ループを使用してオブジェクトを走査するときに返されるのと同じ順序で並べられます (違いは、for-in ループではプロトタイプ チェーン内のプロパティも列挙されることです)。

Object.entries() 、[ [key1, value1], [key2, value2], ..., [keyN, valueN] ] のようなキーと値のペアの配列を返します。

これらのキーと値のペアを直接使用するのはあまり便利ではないかもしれませんが、次に示すように、配列の構造化代入を通じてキーと値にアクセスするのは非常に簡単になります。

食事 = {
  食事A:「朝食」
  食事B: 「ランチ」
  食事C:「夕食」
};
for (let [キー, 値] of Object.entries(食事)) {
  console.log(キー + ':' + 値);
}
// '食事A:朝食' '食事B:昼食' '食事C:夕食'

上記のように、為Object.entries() 、代入や宣言のために余分な行を追加する必要はありません。

bject.entries() 、通常のオブジェクトを Map に変換するときに便利です。これObject.entries()によって返される形式が、Map コンストラクターによって受け入れられる形式 (キー、値) とまったく同じであるためです。

キーと値のペアの 2 次元配列は、通常の Map コンストラクターを使用して Map オブジェクトに変換できます。

ペースを遅くする例を以下に示します。

挨拶をしましょう = {
  朝:「おはようございます」
  正午:「こんにちは」
  夕方:「こんばんは」
};
greetingsMap を新しい Map(Object.entries(greetings)) とします。
greetingsMap.get('morning'); // => 'おはようございます'
greetingsMap.get('midday'); // => 'こんにちは'
greetingsMap.get('evening'); // => 'こんばんは'

マップ オブジェクトはキーと値のペアを格納します。任意の値 (オブジェクトまたはプリミティブ) をキーまたは値として使用できます。

興味深いことに、Map は、Map インスタンスのプロパティ値またはキーと値のペアを抽出するために、 Object.values()およびObject.entries()と同等のメソッド (Iterator を返す点を除く) を提供します。

  • Map.prototype.values() Object.values()と同等です。
  • Map.prototype.entries() Object.entries()と同等です。

mapは通常のオブジェクトの改良版です。マップのサイズを取得したり (通常のオブジェクトの場合は手動で取得する必要があります)、任意のオブジェクト タイプをキーとして使用したりできます (通常のオブジェクトは文字列プリミティブ タイプをキーとして使用します)。

.values() と .entries() のマップを返すメソッドを見てみましょう。

// ...
[...greetingsMap.values()];
// => ['おはようございます', 'こんにちは', 'こんばんは']
[...greetingsMap.entries()];
// => [ ['朝', 'おはよう'], ['正午', 'こんにちは'], 
// ['こんばんは', 'こんばんは'] ]


注: reetingsMap.values()greetingsMap.entries()はイテレータ オブジェクトを返します。結果を配列に入れるには、スプレッド演算子 ... が必要です。

4. オブジェクトプロパティの順序

JS オブジェクトは単純なキーと値のマッピングであるため、オブジェクト内のプロパティの順序は重要ではなく、ほとんどの場合、依存する必要はありません。

ES5 およびそれ以前の標準では、プロパティの順序はまったく指定されていませんでした。

ただし、ES6 以降では、時間が明示的に指定されていない限り、プロパティの順序は特定のルール セットに基づきます。このプロパティのソート規則を説明する例を記述するために、2 つの新しいメソッドObject.getOwnPropertyNames和Reflect.ownKeysを使用します。

  • 数値:属性タイプが数値型の場合、降順で並べ替えられます。
  • 文字列:属性タイプが文字列の場合、時系列順に並べ替えられます。
  • シンボル:属性タイプがシンボルの場合、時系列順に並べ替えられます。

順序付けられたコレクションが必要な場合は、データを配列またはセットに保存することをお勧めします。

要約:

Object.values()Object.entries()は、JS 開発者向けに新しい標準化されたヘルパー関数を提供するためのもう 1 つの改善ステップです。

Object.entries() は、キーと値を異なる変数に簡単に割り当てることができるように配列を構造化する場合に最適です。 この関数を使用すると、プレーンな JS オブジェクトのプロパティを Map オブジェクトに簡単にマッピングすることもできます。 、

注意: Object.values()Object.entries()データを返す順序は定義されていないため、それに依存しないでください。

コードがデプロイされた後にBUG存在するかをリアルタイムで知る方法はありません。後からこれらのバグを解決するために、ログのデバッグに多くの時間を費やしていました。ここで、便利なバグ監視ツールFundebugお勧めしたいと思います。

これで、JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法についての記事は終了です。JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法の詳細については、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • AngularJSループオブジェクトプロパティで動的列を実装するアイデアの詳細な説明
  • JavaScriptはオブジェクトの不要なプロパティを削除します
  • springboot post インターフェースが json を受け入れる場合、それがオブジェクトに変換されると、プロパティはすべて null になります。
  • JavaScript でオブジェクトのプロパティを削除する方法
  • js 属性オブジェクトの hasOwnProperty メソッドの使用
  • JS hasOwnProperty() メソッドは、プロパティがオブジェクト自身のプロパティであるかどうかを検出します。
  • 例を通して JavaScript の Date オブジェクトのプロパティとメソッドを解析する
  • Java オブジェクトを JSON に変換する際のプロパティの動的な追加、削除、変更、クエリの詳細な説明
  • オブジェクトをJSONに変換する場合、Java jacksonはサブオブジェクトのプロパティ操作を無視します。
  • JavaScript オブジェクトの 3 つのプロパティ

<<:  MySqlは指定されたユーザーのデータベースビュークエリ権限を設定します

>>:  Nginx ローカル ディレクトリ マッピング実装コード例

推薦する

mysql バッチで大量のデータを削除する

mysql バッチで大量のデータを削除する1000万件のレコードを持つテーブル(syslogs)があ...

Dockerデータストレージのバインドマウントの詳細な説明

この記事を読む前に、Volumes について予備知識を身に付けておいてください。詳細については、こち...

nginx と keepalived を組み合わせて高可用性を実現するための手順を完了する

序文システムの高可用性を満たすためには、通常、クラスターを構築する必要があります。ホストがクラッシュ...

Vue ベースの円形スクロールリスト機能を実装する

注: 親コンテナーに高さと :data='Array' および overfolw:h...

Docker 経由で Redis 6.x クラスターをデプロイする方法

システム環境: Redis バージョン: 6.0.8 Docker バージョン: 19.03.12シ...

Excelアップロード機能を実現するVue + iViewの完全コード

1. HTML部分 <Col span="2">ファイルをアップロー...

構造とプレゼンテーションの分離を理解するためのWeb標準の学習

Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...

美容・スタイリングウェブサイト向けのカラーマッチングテクニックと効果表示

色はあらゆるウェブサイトにとって最も重要な要素の 1 つであり、閲覧者に大きな影響を与えるため、色の...

ラジオボタンとチェックボックス効果の純粋な CSS 実装例

ラジオボタンとチェックボックスラジオボタンとチェックボックスの効果を実現するための純粋な CSSラジ...

JavaScript の基礎: スコープ

目次範囲グローバルスコープ関数のスコープもし、スイッチ、のために、その間ブロックスコープスコープチェ...

MybatisはSQLクエリのインターセプションと変更の詳細を実装します

序文インターセプターの機能の 1 つは、特定のメソッドの呼び出しをインターセプトできることです。イン...

Linuxターミナルでの一般的なMySQL操作コマンドの詳細な説明

仕える: # chkconfig --list すべてのシステム サービスを一覧表示します # ch...

フレックスレイアウトは左のテキストオーバーフローを実現し、右のテキストの適応を省略します

テキストの長さに応じて、左側のテキストの幅を自動調整できる状況を実現したい。1行が表示できない場合、...

ウェブデザインにおけるグリッドシステム

グリッドシステムの形成1692年、新しく即位したフランス国王ルイ14世は、フランスの印刷技術のレベル...

MySQL パフォーマンスの包括的な最適化方法リファレンス、CPU、ファイルシステムの選択から mysql.cnf パラメータの最適化まで

この記事では、一般的な MySQL 最適化方法をいくつかまとめて簡単に紹介します。これは、フルタイム...