2016-08-24 19 views
8

オブジェクトの配列に順序を設定する最も簡単な方法を見つける必要があります。 例えば、アレイがある:javascriptでオブジェクトの配列に順序を設定する

var array = [ 
    {id: 1, name: "Matt"}, 
    {id: 2, name: "Jack"}, 
    {id: 3, name: "Morgan"}, 
    {id: 4, name: "Bruce"} 
]; 

は、私はarrayアイテムのidプロパティオブジェクトを参照

var order = [1,4,2,3]; 

を提供しています。ソートにインデックスを取得する方法Array#indexOfカスタムソート関数の使用内

var array = [ 
    {id: 1, name: "Matt"}, 
    {id: 4, name: "Bruce"}, 
    {id: 2, name: "Jack"}, 
    {id: 3, name: "Morgan"} 
] 
+0

あなたが達成すべき順序を、持っているので、あなたは、配列の順序を変更したいですか? –

+0

私はあなたがしなければならないことを理解していない、あなたはIDのための配列オブジェクトをしたいですか? – LorenzoBerti

+0

@Pranav C Balanはこの問題を解決し、彼が理解していることを確認してください。また、@Nenad Vracarはこれを解決する良い方法を持っています。私の 'var order'は' array'オブジェクトからのIDの順序を持​​っています。 –

答えて

11

使用Array#sort方法:それはのようにする必要がありますので

は今、私は、配列の順序を変更する必要があります。キーは要素になり、値が、そのオブジェクトを並び替え、各要素のインデックスとされる場所

var array = [{ 
 
    id: 1, 
 
    name: "Matt" 
 
}, { 
 
    id: 2, 
 
    name: "Jack" 
 
}, { 
 
    id: 3, 
 
    name: "Morgan" 
 
}, { 
 
    id: 4, 
 
    name: "Bruce" 
 
}]; 
 

 
var order = [1, 4, 2, 3]; 
 

 

 
array.sort(function(a, b) { 
 
    // sort based on the index in order array 
 
    return order.indexOf(a.id) - order.indexOf(b.id); 
 
}) 
 

 
console.log(array);

+0

関数は何を返すべきですか?数値?ブール値? – user6245072

+0

@ user6245072:番号、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description –

1

また、オブジェクトを返すために[1,4,2,3]アレイ上reduce()を使用することができます。

var array = [ 
 
    {id: 1, name: "Matt"}, 
 
    {id: 2, name: "Jack"}, 
 
    {id: 3, name: "Morgan"}, 
 
    {id: 4, name: "Bruce"} 
 
]; 
 

 
var s = [1,4,2,3].reduce((r, e, i) => {return r[e] = i, r}, {}); 
 
var result = array.sort(function(a, b) { 
 
    return s[a.id] - s[b.id]; 
 
}); 
 
console.log(result)

0

私は、ソート含ま何かがO(2N)ソリューションよりも効率的ではないことができますね。ですから、私はこのような仕事を2つの還元で以下のようにしたいと思います。だから、

var arr = [{id: 1, name: "Matt"}, {id: 2, name: "Jack"}, {id: 3, name: "Morgan"}, {id: 4, name: "Bruce"}], 
 
    order = [1,4,2,3], 
 
    lut = order.reduce((t,e,i) => (t[e] = i,t),{}), 
 
result = arr.reduce((res,obj) => (res[lut[obj.id]] = obj, res) ,[]); 
 
console.log(result);

関連する問題