Je me rends compte que cela a été demandé il y a quelque temps, mais j'ai pensé ajouter ma solution.
Cette fonction génère des méthodes de tri dynamiquement. fournissez simplement chaque nom de propriété enfant triable, précédé de +/- pour indiquer l'ordre croissant ou décroissant. Super réutilisable, et il n'a pas besoin de savoir quoi que ce soit sur la structure de données que vous avez créée. Cela pourrait être une preuve idiote - mais cela ne semble pas nécessaire.
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;}
}
}
}
exemple d'utilisation:
items.sort (getSortMethod ('- prix', '+ priorité', '+ nom'));
ce serait le tri le itemsplus bas en pricepremier, les liens allant à l'élément avec le plus hautpriority . d'autres liens sont rompus par l'articlename
où items est un tableau comme:
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 } ...
];
démo en direct: http://gregtaff.com/misc/multi_field_sort/
EDIT: Correction d'un problème avec Chrome.