Sei que isso foi perguntado há algum tempo, mas pensei em acrescentar minha solução.
Esta função gera métodos de classificação dinamicamente. simplesmente forneça cada nome de propriedade filha classificável, prefixado com +/- para indicar a ordem crescente ou decrescente. Super reutilizável e não precisa saber nada sobre a estrutura de dados que você montou. Poderia ser feito à prova de idiotas - mas não parece necessário.
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;}
}
}
}
exemplo de uso:
items.sort (getSortMethod ('- preço', '+ prioridade', '+ nome'));
isso iria classificar items
com menor price
primeiro, com os laços que vão para o item com maior priority
. outros laços são quebrados pelo itemname
onde itens é uma matriz como:
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 } ...
];
demonstração ao vivo: http://gregtaff.com/misc/multi_field_sort/
EDIT: Corrigido problema com o Chrome.