web-dev-qa-db-ja.com

JavaScriptオブジェクトの配列を特定の順序でソートする(既存の関数を使用)

オブジェクトの配列が与えられた場合:

 {
キー: "a"、
値:42 
}、
 {
キー: "d"、
値:28 
}、
 {
キー: "c"、
値:92 
}、
 {
キー: "b"、
値:87 
} 

キーの配列:

["c", "a", "b", "d"]

並べ替えを可能にするECMAScript関数またはサードパーティのJavaScriptライブラリはありますか-1行/関数呼び出し-オブジェクトの最初の配列、2番目の配列で指定されたキーの順序と一致し、結果は次のようになります。

 {
キー: "c"、
値:92 
}、
 {
キー: "a"、
値:42 
}、
 {
キー: "b"、
値:87 
}、
 {
キー: "d"、
値:28 
} 

関数またはアルゴリズムを提供するその他の質問:

類似/関連する質問:

25
mkopala

indexOfを使用して、キーを正しい順序に変換します。

var order = ["c", "a", "b", "d"];
_.sortBy(arr, function(obj){ 
    return _.indexOf(order, obj.key);
});

フィドル

キーが多い場合は、次のように配列からハッシュマップを作成すると便利です。

var order = ["c", "a", "b", "d"];
var orderMap = {};
_.each(order, function(i) { orderMap[i] = _.indexOf(order, i); });

これにより、O(n)ではなく、キーのソートのルックアップが一定の時間になります。 ( フィドル

46
McGarnagle

これまでに提供された素晴らしい答え。以下もプレーンなJSの代替ソリューションである可能性があると考えました:

var arr = arr.sort(function(a,b) {
    return order.indexOf( a.key ) > order.indexOf( b.key );
    //for the sake of recent versions of Google Chrome use:
    //return a.key.charCodeAt(0) > b.key.charCodeAt(0); or return a.key.charCodeAt(0) - b.key.charCodeAt(0);
});
var arr = [
    {
        key: "a",
        value: 42
    },
    {
        key: "d",
        value: 28
    },
    {
        key: "c",
        value: 92
    },
    {
        key: "b",
        value: 87
    }
];

var order = ["c", "a", "b", "d"];

console.log( 'Original: ', JSON.stringify( arr ) );

var arr = arr.sort(function(a,b) {
      return order.indexOf( a.key ) > order.indexOf( b.key );
});

console.log( 'Ordered: ', JSON.stringify( arr ) );
20
PeterKA

これがmostの効率的な方法であるとは言えませんが、各オブジェクトのkeyをプロパティのキーとして使用できます別のオブジェクトで。次に、これらのキーでそれらにアクセスします。

for (x = 0; x < objn.length; x++) {
    newobj[objn[x].key] = objn[x];
}
objn = [];
for (x = 0; x < keys.length; x++) {
    objn.Push(newobj[keys[x]]);
}
console.log(objn);

http://jsfiddle.net/WdehF/

2
Explosion Pills
// create hash map el.key -> index, to help us with direct access, avoid searching
const hashMap = arr.reduce((acc, el, index) => { acc[el.id] = el; return acc }, {})

// finally, map the ids to the final result
const ids.map(id => hashMap[id])
0
Josmar