2017-03-21 13 views
0

私は、thisの以前の記事と同様の必要性を持っています:キーを失うことなくオブジェクトを並べ替える必要があります。しかし、私は、オブジェクトのオブジェクトを持っている:キーを紛失することなく値でディープオブジェクトを並べ替えて並べ替える

var o = { 
    123: { field: "science", name: "zed" }, 
    234: { field: "tech", name: "sara" }, 
    672: { field: "arts", name: "jon" } 
} 

_.fromPairs(_.sortBy(_.toPairs(o),function(a){ return a[1] }).reverse()) 

上記の他のトピックに言及したlodashソリューションを使用しています - しかし私は、(キーを保持していますカントー!)の結果のいずれかの一貫性が届かない

をどれでも助けに感謝します。

答えて

0

オブジェクトは比類なきものではないので、あなたは上記の値をどのような値に並べ替えるべきかについてはっきりしていません。しかし、あなたが名前フィールドでそれらを並べ替えることを望んでいたとしましょう - あなたはそれがまだ動作しないことがわかります。

まずいくつかの背景:

歴史的には、オブジェクトのプロパティは、ESに順不同と考えられました。キーが列挙されるシーケンス(例えば、for ... inまたはObject.keys())は、実装固有のものでした。

ただし、ES2015では列挙順序が特定の動作になりました。最低から最高に、最初に列挙されている整数です

  1. キー:

    その列挙順序は、ほとんどのエンジンがすでにやっていたものを体系化します。

  2. 文字列キーは、割り当て順に列挙されます。
  3. シンボルキーは、割り当て順に列挙されます。

整数を順序キーとして使用する必要がある場合は、別のデータ構造が必要です。 Mapは適切である:

const o = { 
 
     123: { field: "science", name: "zed" }, 
 
     234: { field: "tech", name: "sara" }, 
 
     672: { field: "arts", name: "jon" } 
 
    } 
 

 
    const { compare } = new Intl.Collator(); 
 

 
    const res = new Map(Object 
 
     .entries(o) 
 
     .sort(([ , a ], [ , b ]) => compare(a.name, b.name)) 
 
    ); 
 

 
    console.log([ ...res ]);

古いIEを心配する必要がある場合は、キーと値のエントリの配列も十分であろう。

+0

これは素晴らしいですね!ユーザーが選択した内容に応じて、並べ替えられたものに柔軟性が必要です。再び、魅力を働かせて、ありがとう! – user7472652

関連する問題