38

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

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

およびキーの配列:

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

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

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

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

類似/関連する質問:

4

5 に答える 5

62

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) ではなく一定時間になります。(フィドル)

于 2013-09-17T20:27:32.593 に答える
3

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

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/

于 2013-09-17T20:32:23.857 に答える