web-dev-qa-db-fra.com

Trier un tableau contenant des tableaux par chaîne

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! :)

55
dmnkhhn

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);
92
Martin Milan

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;
});
40
vhallac

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

12
luschn

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)

7
gordon

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.

5
Brian M. Hunt