J'ai un tableau qui contient plusieurs tableaux et je voudrais ordonner les tableaux en fonction d'une certaine chaîne dans ces tableaux.
var myArray = [
[1, 'alfred', '...'],
[23, 'berta', '...'],
[2, 'zimmermann', '...'],
[4, 'albert', '...'],
];
Comment puis-je le trier par nom pour que albert vient en premier et zimmermann vient en dernier?
Je sais comment je le ferais si je pouvais utiliser l'entier pour le tri, mais la chaîne me laisse sans idée.
Merci pour votre aide! :)
Ceci peut être réalisé en passant une fonction de support comme argument à Array.sort
appel de méthode.
Quelque chose comme ça:
function Comparator(a, b) {
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
return 0;
}
var myArray = [
[1, 'alfred', '...'],
[23, 'berta', '...'],
[2, 'zimmermann', '...'],
[4, 'albert', '...'],
];
myArray = myArray.sort(Comparator);
console.log(myArray);
Vous pouvez toujours utiliser array.sort()
avec une fonction personnalisée. Dans la fonction, comparez simplement l'élément que vous souhaitez utiliser comme clé. Pour votre exemple, vous pouvez utiliser:
myArray.sort(function(a, b) {
return a[1] > b[1] ? 1 : -1;
});
Il existe maintenant un moyen plus simple:
myArray = myArray.sort(function(a, b) {
return a[1].localeCompare(b[1]);
})
Il est également insensible à la casse.
Source: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare
Impressionnant! Le tri composé sur le premier élément, le deuxième et le troisième, tous ascendants dans cet exemple, serait
myArray=myArray.sort(function(a,b){
retVal=0;
if(a[0]!=b[0]) retVal=a[0]>b[0]?1:-1;
else if(a[1]!=b[1]) retVal=a[1]>b[1]?1:-1;
else if(a[2]!=b[2]) retVal=a[2]>b[2]?1:-1;
return retVal
});
(tri multiple sur plusieurs colonnes)
Dans ES6, on pourrait faire le relativement lapidaire:
myArray.sort(([a], [b]) => a.localeCompare(b))
ou
myArray.sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)
Les bits utiles/modernes étant le =>
opérateur lambda et [X]
déstructuration des arguments.