0

これは何度か尋ねられたと想像できますが、私が理解しようとしている特定の問題の解決策の例を文字通り見つけることができません。

だから私はそのようなオブジェクトを持っています:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];

次に、次のような「順序」である配列があります。

var order = [2, 0, 1];

'order'配列を使用して、コレクションをその特定の順序で並べ替えたいと思います。.sort関数を使用してかなりの数のソリューションを試してきましたが、適切なソリューションが見つかりません。誰かが私を啓発できますか?おそらく単純なことだと思います。

4

5 に答える 5

5

sort()メソッドを使用して、次を使用してこれを実現できindexOfます。

collection.sort(function(a, b){
    return order.indexOf(a.id) > order.indexOf(b.id);
});
于 2013-02-10T23:40:57.513 に答える
2

indexOf次のように、カスタム並べ替え関数の順序配列で関数を使用できます。

collection.sort(function(x, y) {
                     return order.indexOf(x.id) > order.indexOf(y.id);
                });
于 2013-02-10T23:43:52.467 に答える
1

それと同じくらい簡単なようです:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
var order = [2, 0, 1];
var sorted = [];
for(var i=0,c=order.length;i<c;i++){
    sorted.push(collection[order[i]]);
}
于 2013-02-10T23:37:59.900 に答える
1

それを試してください:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
var order = [2, 0, 1];
var sortedCollection = [];
for ( var i = 0; i < order.length; i++ ) 
  sortedCollection.push(collection[order[i]]);
console.log(sortedCollection);
于 2013-02-10T23:40:07.767 に答える
0

ここで避けたいことは、これらの配列のいずれかを必要以上にスキャンすることです。

これを回避する 1 つの解決策を次に示します。

/*
 * Map the indexes of the objects in collection to their final location
 */
var sortIndex = {};
order.forEach(function(value, index) {
  sortIndex[value] = index;
});

/*
 * Put the objects in collection into their new, sorted collection
 */
var sortedCollection = [];
collection.forEach(function(value) {
  var sortedLocation = sortIndex[value.id];
   sortedCollection[sortedLocation] = value;

});

したがって、各アレイを 1 回スキャンするだけで、作業を最小限に抑えることができます。

forEachここでは便宜上使用しました。Lodash や Underscore などのライブラリを使用するか、これを書き直して、配列に対して明示的な反復を使用することができます。

于 2013-02-10T23:45:05.843 に答える