Vous pouvez également créer une fonction de tri dynamique qui trie les objets en fonction de la valeur que vous leur transmettez :
function dynamicSort(property) {
var sortOrder = 1;
if(property[0] === "-") {
sortOrder = -1;
property = property.substr(1);
}
return function (a,b) {
/* next line works with strings and numbers,
* and you may want to customize it to your needs
*/
var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
return result * sortOrder;
}
}
Vous pouvez donc avoir un tableau d'objets comme celui-ci :
var People = [
{Name: "Name", Surname: "Surname"},
{Name:"AAA", Surname:"ZZZ"},
{Name: "Name", Surname: "AAA"}
];
...et cela fonctionnera quand vous le ferez :
People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));
En fait, ceci répond déjà à la question. La partie ci-dessous a été rédigée parce que de nombreuses personnes m'ont contacté, se plaignant que il ne fonctionne pas avec des paramètres multiples .
Paramètres multiples
Vous pouvez utiliser la fonction ci-dessous pour générer des fonctions de tri avec plusieurs paramètres de tri.
function dynamicSortMultiple() {
/*
* save the arguments object as it will be overwritten
* note that arguments object is an array-like object
* consisting of the names of the properties to sort by
*/
var props = arguments;
return function (obj1, obj2) {
var i = 0, result = 0, numberOfProperties = props.length;
/* try getting a different result from 0 (equal)
* as long as we have extra properties to compare
*/
while(result === 0 && i < numberOfProperties) {
result = dynamicSort(props[i])(obj1, obj2);
i++;
}
return result;
}
}
Ce qui vous permettrait de faire quelque chose comme ça :
People.sort(dynamicSortMultiple("Name", "-Surname"));
Sous-classement du tableau
Pour les plus chanceux d'entre nous qui peuvent utiliser ES6, qui permet d'étendre les objets natifs :
class MyArray extends Array {
sortBy(...args) {
return this.sort(dynamicSortMultiple(...args));
}
}
Cela permettrait de le faire :
MyArray.from(People).sortBy("Name", "-Surname");
7 votes
Ce script vous permet justement de le faire, à moins que vous ne souhaitiez écrire votre propre fonction de comparaison ou de tri : thomasfrank.se/trier_les_choses.html
0 votes
Le moyen le plus rapide est d'utiliser l'isomorphe tri-array qui fonctionne nativement dans le navigateur et dans le nœud, et qui prend en charge tous les types d'entrées, les champs calculés et les ordres de tri personnalisés.
9 votes
Pls
objs.sort((a, b) => a.last_nom > b.last_nom && 1 || -1)
0 votes
Function compare( a, b ) { if ( a.last_nom < b.last_nom ){ return -1 ; } if ( a.last_nom > b.last_nom ){ return 1 ; } return 0 ; } objs.sort( compare ) ;
0 votes
Objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))
0 votes
@artem Veuillez soumettre votre propre réponse.
1 votes
@RobertTalada c'est ma réponse stackoverflow.com/a/67021585/7012450
0 votes
Le modèle de tri par propriétés lexicographiquement est
objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom))
. Pour trier numériquement , utilisera.prop - b.prop
. Pour trier en ordre décroissant plutôt qu'en ordre croissant, il convient d'annuler la valeur de retour (par ex.b.last_nom.localeCompare(a.last_nom)
au lieu dea.last_nom.localeCompare(b.last_nom)
). Pour trier par propriétés multiples , d'autres sortes de chaînes avec||
, par exempleb.someNumber - a.someNumber || a.someString.localeCompare(b.someString)
.