2017-02-27 3 views
2

私はそうのようにそれにプロパティを割り当てるオブジェクトnewData持っている:これは私が得るものであるように、数値プロパティの自動並べ替えを取り除くにはどうすればよいですか?

{ 
    '3': 'test 2', 
    '5': 'test 1', 
    '8': 'test 3' 
} 

しかし、私はプロパティの挿入順序を維持したい:私は取得

newData['5'] = 'test 1'; 
newData['3'] = 'test 2'; 
newData['8'] = 'test 3'; 

を:

{ 
    '5': 'test 1', 
    '3': 'test 2', 
    '8': 'test 3' 
} 

ここで、5,3および8は挿入順にとどまっています。 JavaScriptオブジェクトには順序はありませんが、明らかにこれは...そしてこれはループをひどく乱すことになります。

JavaScriptの配列はカスタムキーをサポートしていないので、これはオブジェクトである必要があります。どのようにオブジェクトに追加し、それが想定されているように順序付けられていない状態に保つのですか?

+0

なぜ注文する必要がありますか?オブジェクトをどのように消費しているかを示すことができますか? –

+0

オブジェクトはデザインによって順序付けされていませんが、そのように格納することはできません。 – JohanP

答えて

4

オブジェクトのプロパティdoには、挿入順序とは異なる順序があります。これはECMAScript 2015 Language Specificationに記載しています:

9.1.12 [OwnPropertyKeys]()Oの[OwnPropertyKeys]]内部メソッドは、以下のステップがとられる呼ばれる

  1. キーを新しい空にするList。各自property keyP 昇順数値インデックス順
    で、整数インデックスであるO
    について
  2. キーの最後の要素として、を追加します。プロパティの作成順
    に、文字列であるが、整数のインデックスではないOの各々独自property keyPについて
  3. キーの最後の要素として、を追加します。各自property keyPプロパティ作成順
    に、シンボルでO
    について
  4. キーの最後の要素として、を追加します。
  5. 戻り値。上記で

は、プロパティリストキーとして定義されます。次に、整数であるプロパティが見つかった場合は、リストの数字の昇順にに追加され、3,5,8になります。

挿入に基づいて注文を尊重する順序付けされたキーと値のペアが必要な場合は、ES6 Mapなど、注文を考慮したものを使用する必要があります。ドキュメントあたり:

地図オブジェクトは、オーダーにその要素を反復する - for...ofループが反復ごとに[key, value]の配列を返します。

const obj = new Map([ 
 
    [5, "test 1"], 
 
    [3, "test 2"], 
 
    [8, "test 3"] 
 
]); 
 

 
for(let [key, value] of obj) { 
 
    console.log(key, value); 
 
}

まず、あなたはコンストラクタに配列の配列を渡す:

は、ここでの例です。 Mapコンストラクタは反復可能性を取り、そのサブ配列をキーと値のペアとして使用します。 Mapは、基本的に次のようになります。

+-----+----------+ 
| Key | Value | 
+-----+----------+ 
| 5 | "test 1" | 
| 3 | "test 2" | 
| 8 | "test 3" | 
+-----+----------+ 

次はあなたがMapを反復するfor...ofループを使用します。ドキュメントに記載されているように、[key, value]の配列がイテレータによって返されるので、array destructuringを使用できます。したがって、keyvalueは、それぞれMapのキーと値の値を保持し、それらをログに記録することで、所望の順序付けられた結果が得られます。

0

Mapをご覧ください。それは、挿入順序に基づいてトラバーサルを尊重します。

関連する問題