これは少し前に尋ねられたことに気づきましたが、私は自分の解決策を追加しようと思いました。
この関数は、ソートメソッドを動的に生成します。並べ替え可能な各子プロパティ名に+/-を付けて、昇順または降順を示すだけです。非常に再利用可能であり、まとめたデータ構造について何も知る必要はありません。ばかげた証拠にすることができますが、必要ではないようです。
function getSortMethod(){
var _args = Array.prototype.slice.call(arguments);
return function(a, b){
for(var x in _args){
var ax = a[_args[x].substring(1)];
var bx = b[_args[x].substring(1)];
var cx;
ax = typeof ax == "string" ? ax.toLowerCase() : ax / 1;
bx = typeof bx == "string" ? bx.toLowerCase() : bx / 1;
if(_args[x].substring(0,1) == "-"){cx = ax; ax = bx; bx = cx;}
if(ax != bx){return ax < bx ? -1 : 1;}
}
}
}
使用例:
items.sort(getSortMethod( '-price'、 '+ priority'、 '+ name'));
これは最初にitems
最低でソートされprice
、同点は最高のアイテムに行きpriority
ます。それ以上の結びつきはアイテムによって壊れますname
ここで、itemsは次のような配列です。
var items = [
{ name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
{ name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
{ name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
{ name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
{ name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];
ライブデモ:http: //gregtaff.com/misc/multi_field_sort/
編集:Chromeの問題を修正しました。