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 ローカル ディレクトリ マッピング実装コード例

推薦する

Centos7 に PHP と Nginx をインストールする詳細なチュートリアル

Centos のサーバー側への適用がますます普及するにつれて、Centos7 もますます使用されるよ...

Linux chkconfig コマンドの使用

1. コマンドの紹介chkconfig コマンドは、システム サービスの実行レベル情報を更新および照...

HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 1)

中国の習慣では、旧暦の1月15日より前に新年を祝います。ここで、庭にいる友人たちに新年の幸せを祈りた...

Docker共通コマンドの詳しい解説 Study03

目次1. ヘルプコマンド2. ミラーコマンド3. コンテナコマンド1. ヘルプコマンド1. 現在のD...

CSS でフッターの「下部吸収」効果を実現

よく遭遇する問題: 下部の要素を「下部に貼り付ける」効果を CSS でどのように実現するか。この記事...

JS の 3 つの主要な問題、非同期性とシングルスレッドについて簡単に説明します。

目次シングルスレッド非同期シングルスレッドしかし、開発中にネットワーク リクエストやスケジュールされ...

Node.js で MySQL データベースにバッチデータを挿入する方法

プロジェクト(nodejs)では、一度に複数のデータをデータベースに挿入する必要があります。データベ...

WeChatミニプログラムビデオ集中砲火位置ランダム

この記事では、WeChatミニプログラムのビデオ弾幕の位置をランダム化するための具体的なコードを紹介...

Webサービスのリモートデバッグとタイムアウト動作原理の分析

Webサービスのリモートデバッグ.NET では、WEBSERVICE のリモート デバッグ機能はデフ...

ウェブページでmp3またはフラッシュプレーヤーコードを再生する

コードをコピーコードは次のとおりです。 <オブジェクト id="player1&qu...

...

Vue ローカルコンポーネントデータ共有 Vue.observable() の使用

コンポーネントが詳細になるにつれて、複数のコンポーネントが状態を共有する状況に遭遇するでしょう。Vu...

Win10 での MySQL 8.0.16 のインストールと設定のチュートリアル

1. MySQL 8.0.16を解凍する次の図に示すように、解凍後にdadaフォルダとmy.ini構...

Vue のローカルコンポーネントの紹介

Vueでは、ローカルコンポーネントを自分で定義(登録)することができます。コンポーネント名を定義する...

フォームの送信イベントが応答しない

1. 問題の説明<br />JS を使用してフォームの送信メソッドを呼び出してフォームを...