107 votes

Fonction de tri en Javascript. Trier par premier puis par second

J'ai un tableau d'objets à trier. Chaque objet a deux paramètres : Force et Nom

objects = []
object[0] = {strength: 3, name: "Leo"}
object[1] = {strength: 3, name: "Mike"}

Je souhaite trier par force puis par nom dans l'ordre alphabétique. J'utilise le code suivant pour trier en fonction du premier paramètre. Comment trier ensuite en fonction du deuxième paramètre ?

function sortF(ob1,ob2) {
  if (ob1.strength > ob2.strength) {return 1}
  else if (ob1.strength < ob2.strength){return -1}
  return 0;
};

Merci pour votre aide.

(J'utilise Array.sort() avec la fonction de comparaison de tri sortF mentionnée plus haut).

135voto

Matt Points 38395

Développez votre fonction de tri comme suit ;

function sortF(ob1,ob2) {
    if (ob1.strength > ob2.strength) {
        return 1;
    } else if (ob1.strength < ob2.strength) { 
        return -1;
    }

    // Else go to the 2nd item
    if (ob1.name < ob2.name) { 
        return -1;
    } else if (ob1.name > ob2.name) {
        return 1
    } else { // nothing to split them
        return 0;
    }
}

A < y > comparaison de chaînes de caractères est une comparaison alphabétique.

95voto

georg Points 52691

Cette petite fonction est souvent pratique pour trier par plusieurs clés :

cmp = function(a, b) {
    if (a > b) return +1;
    if (a < b) return -1;
    return 0;
}

ou, de manière plus concise,

cmp = (a, b) => (a > b) - (a < b)

Ce qui fonctionne car en javascript :

true - true // gives 0
false - false // gives 0
true - false // gives 1
false - true // gives -1

Appliquez-le comme suit :

array.sort(function(a, b) { 
    return cmp(a.strength,b.strength) || cmp(a.name,b.name)
})

Il manque à Javascript la fonction opérateur de vaisseau spatial ce qui rend ces comparaisons extrêmement élégantes.

49voto

Nina Scholz Points 17120

Vous pouvez enchaîner l'ordre de tri avec le OU logique.

objects.sort(function (a, b) {
    return a.strength - b.strength || a.name.localeCompare(b.name);
});

15voto

Teun D Points 2445

Lorsque j'ai cherché une réponse à cette même question, les réponses que j'ai trouvées sur StackOverflow n'étaient pas vraiment celles que j'espérais. J'ai donc créé une fonction simple et réutilisable qui fait exactement cela. Elle vous permet d'utiliser la fonction standard Array.sort mais avec firstBy().thenBy().thenBy() le style. https://github.com/Teun/thenBy.js

PS. C'est la deuxième fois que je poste ceci. La première fois a été supprimée par un modérateur qui a dit "S'il vous plaît, ne faites pas de messages promotionnels pour votre propre travail". Je ne sais pas quelles sont les règles ici, mais j'essayais de répondre à cette question. Je suis vraiment désolé qu'il s'agisse de mon propre travail. N'hésitez pas à le supprimer à nouveau, mais indiquez-moi la règle concernée.

5voto

rocketsarefast Points 1167

La réponse de Steve, mais en plus beau.

objects.sort(function(a,b)
{
  if(a.strength > b.strength) {return  1;}
  if(a.strength < b.strength) {return -1;}
  if(a.name     > b.name    ) {return  1;}
  if(a.name     < b.name    ) {return -1;}
  return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X