Trier le tableau par prénom (par ordre alphabétique) en Javascript
J'ai un tableau (voir ci-dessous pour un objet dans le tableau) que je dois Trier par prénom en utilisant JavaScript. Comment puis-je le faire?
var user = {
bio: null,
email: "user@domain.com",
firstname: "Anna",
id: 318,
lastAvatar: null,
lastMessage: null,
lastname: "Nickson",
nickname: "anny"
};
17 réponses
Supposons que vous ayez un tableau users
. Vous pouvez utiliser users.sort
et passer une fonction qui prend deux arguments et les comparer (comparateur)
Il devrait retourner
- quelque chose de négatif si le premier argument est inférieur à la seconde (doit être placé avant la seconde dans le tableau résultant)
- quelque chose de positif si le premier argument est plus grand (devrait être placé après le second)
- 0 si ces deux éléments sont égaux.
Dans notre cas, si deux éléments sont a
et b
, nous voulons comparer les a.firstname
et b.firstname
Exemple:
users.sort(function(a, b){
if(a.firstname < b.firstname) return -1;
if(a.firstname > b.firstname) return 1;
return 0;
})
Ce code va fonctionner avec n'importe quel type.
Notez que dans "real life" ™ vous voulez souvent ignorer la casse, trier correctement les diacritiques, les symboles étranges comme ß, etc. lorsque vous comparez des chaînes, vous pouvez donc utiliser localeCompare
. Voir d'autres réponses pour plus de clarté.
Quelque Chose comme ceci:
array.sort(function(a, b){
var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase();
if (nameA < nameB) //sort string ascending
return -1;
if (nameA > nameB)
return 1;
return 0; //default return value (no sorting)
});
Si les chaînes comparées contiennent des caractères unicode, vous pouvez utiliser localeCompare
Fonction de la classe String
comme suit:
users.sort(function(a,b){
return a.firstname.localeCompare(b.firstname);
})
Code le plus court possible avec ES6!
users.sort((a, b) => a.firstname.localeCompare(b.firstname))
Chaîne de caractères.prototype.localeCompare() Le support de base est universel!
Belle petite ES6 une doublure:
users.sort((a, b) => a.firstname !== b.firstname ? a.firstname < b.firstname ? -1 : 1 : 0);
Underscorejs offre la très belle _.fonction sortBy:
_.sortBy([{a:1},{a:3},{a:2}], "a")
Ou vous pouvez utiliser une fonction de tri personnalisé:
_.sortBy([{a:"b"},{a:"c"},{a:"a"}], function(i) {return i.a.toLowerCase()})
Fondamentalement, vous pouvez trier les tableaux avec le tri par méthode, mais si vous voulez trier les objets, vous devez passer la fonction à la méthode de tri du tableau, donc je vais vous donner un exemple en utilisant votre tableau
user = [{
bio: "<null>",
email: "user@domain.com",
firstname: 'Anna',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Senad',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
},
{
bio: "<null>",
email: "user@domain.com",
firstname: 'Muhamed',
id: 318,
"last_avatar": "<null>",
"last_message": "<null>",
lastname: 'Nickson',
nickname: 'anny'
}];
var ar = user.sort(function(a, b)
{
var nA = a.firstname.toLowerCase();
var nB = b.firstname.toLowerCase();
if(nA < nB)
return -1;
else if(nA > nB)
return 1;
return 0;
});
Nous pouvons utiliser localeCompare mais nous devons également vérifier les clés pour les valeurs falsey
Le code ci-dessous ne fonctionnera pas si une entrée a manquant lname.
obj.sort((a, b) => a.lname.localeCompare(b.lname))
Nous devons donc vérifier la valeur falsey comme ci-dessous
let obj=[
{name:'john',lname:'doe',address:'Alaska'},
{name:'tom',lname:'hopes',address:'California'},
{name:'harry',address:'Texas'}
]
let field='lname';
console.log(obj.sort((a, b) => (a[field] || "").toString().localeCompare((b[field] || "").toString())));
Ou
Nous pouvons utiliser lodash, c'est très simple. Il détectera les valeurs renvoyées, c'est-à-dire si nombre ou chaîne et fera le tri en conséquence .
import sortBy from 'lodash/sortBy';
sortBy(obj,'name')
Inspiré de ce réponse,
users.sort((a,b) => (a.firstname - b.firstname));
Une notation plus compacte:
user.sort(function(a, b){
return a.firstname == b.firstname ? 0 : a.firstname < b.firstname ? -1 : 1;
})
Vous pouvez l'utiliser pour les objets
transform(array: any[], field: string): any[] {
return array.sort((a, b) => a[field].toLowerCase() !== b[field].toLowerCase() ? a[field].toLowerCase() < b[field].toLowerCase() ? -1 : 1 : 0);}
A poussé les meilleures réponses dans un prototype pour les Trier par clé.
Array.prototype.alphaSortByKey= function (key) {
this.sort(function (a, b) {
if (a[key] < b[key])
return -1;
if (a[key] > b[key])
return 1;
return 0;
});
return this;
};
Vous pouvez utiliser la méthode de tableau intégrée - sort
. Cette méthode prend une méthode de rappel en tant que param
// custom sort function to be passed as param/callback to the Array's sort method
function myCustomSort(a, b) {
return (a.toLowerCase() > b.toLowerCase()) ? 1 : -1;
}
// Actual method to be called by entity that needs sorting feature
function sortStrings() {
var op = Array.prototype.sort.call(arguments, myCustomSort);
}
// Testing the implementation
var sortedArray = sortStrings("Burger", "Mayo1", "Pizza", "boxes", "Apples", "Mayo");
console.log(sortedArray); //["Apples", "boxes", "Burger", "Mayo", "Mayo1", "Pizza"]
Points clés à noter pour comprendre ce code.
- la méthode personnalisée, dans ce cas,
myCustomSort
, devrait renvoyer + 1 ou -1 pour chaque paire d'éléments (à partir du tableau d'entrée) comparaison. - Utilisation
toLowerCase()
/toUpperCase()
dans la méthode de rappel de tri personnalisée, cette différence de cas n'affecte pas l'exactitude du processus de tri.
J'espère que c'est clair assez d'explication. N'hésitez pas à commenter si vous pensez, plus d'informations sont nécessaires.
Cheers!
En termes simples, vous pouvez utiliser cette méthode
users.sort(function(a,b){return a.firstname < b.firstname ? -1 : 1});
Dans le cas où nous sommes de tri des noms ou quelque chose avec des caractères spéciaux, comme ñ ou áéíóú (communes en espagnol), nous pourrions utiliser les paramètres les paramètres régionaux (es, pour l'espagnol, dans ce cas ) et options comme ceci:
let user = [{'firstname': 'Az'},{'firstname': 'Áb'},{'firstname':'ay'},{'firstname': 'Ña'},{'firstname': 'Nz'},{'firstname': 'ny'}];
user.sort((a, b) => a.firstname.localeCompare(b.firstname, 'es', {sensitivity: 'base'}))
console.log(user)
Les options locales officielles peuvent être trouvées ici dans iana, es (espagnol), de (Allemand), fr (Français). À propos de sensibilité base signifie:
Seules les chaînes qui diffèrent les lettres de base se comparent comme inégales. Exemples: a ≠ b, a = á, un = A.
Vous pouvez utiliser quelque chose de similaire, pour se débarrasser de sensible à la casse
users.sort(function(a, b){
//compare two values
if(a.firstname.toLowerCase() < b.firstname.toLowerCase()) return -1;
if(a.firstname.toLowerCase() > b.firstname.toLowerCase()) return 1;
return 0;
})
Aussi pour le tri asec et desc, vous pouvez utiliser ceci : supposons que nous ayons une variable SortType qui spécifie le tri croissant ou le tri décroissant que vous voulez:
users.sort(function(a,b){
return sortType==="asc"? a.firstName.localeCompare( b.firstName): -( a.firstName.localeCompare( b.firstName));
})