135 votes

Javascript trier un tableau d'objets par une propriété booléenne

Voir l'édition à la fin pour le problème réel.

Ok, j'ai ce scénario :

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

Alors si je fais ça :

a.sort(function(a,b){return !a && b});

Ça me donne ça :

[false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

Il fait une sorte de... mais pas tout à fait... :(

Comment puis-je trier ce tableau ?

EDIT :

Si vous vous demandez pourquoi je n'ai pas utilisé simplement a.sort(), c'est parce que mon tableau réel est composé d'objets, et non d'un simple tableau comme celui que j'ai posté. Le vrai tableau a des éléments qui ressemblent à [{xx:true},{xx:false},...].

301voto

c.P.u1 Points 5174
a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];

    a.sort(function(x, y) {
        // true values first
        return (x === y)? 0 : x? -1 : 1;
        // false values first
        // return (x === y)? 0 : x? 1 : -1;
    });

    console.log(a);

Vous devez retourner 0 lorsque a et b ont la même valeur, -1 si a est vrai et 1 sinon.

52voto

sroes Points 6961

Pour empêcher la conversion implicite des types (ce que les langages comme TypeScript n'apprécient pas), vous pouvez utiliser la commande Number() pour convertir explicitement le booléen en un nombre :

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort(function(x, y) {
   return Number(x) - Number(y);
});
console.log(a);

Ou en utilisant les fonctions de flèches :

a = [false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false];
a.sort((x, y) => Number(x) - Number(y));
console.log(a);

47voto

dandavis Points 4792

D'une manière plus simple :

a = [{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false},{xx:true},{xx:false}];

a.sort(function(a,b){return a.xx-b.xx});

console.log(a);

vous pouvez appeler a.reverse() après le sort() si vous voulez qu'il soit trié dans l'autre sens

EDIT : édité pour refléter la mise à jour de la question du tri d'un tableau d'objets au lieu d'un tableau de booléens.

25voto

CapK Points 3873

Un tableau n'a pas de positions égales, alors pourquoi ne pas laisser de côté la vérification des égalités, et toujours retourner soit -1 soit 1. Cette approche fonctionne bien avec TS.

a.sort(x => x ? -1 : 1)

Note : Je suis un peu préoccupé par la façon dont cela affecte les internes de la fonction de tri, mais cela semble faire l'affaire.

Si vous voulez faire un tri inverse

a.sort(x => !x ? -1 : 1)

22voto

Une solution simple :

[true, false, true, false].sort((a, b) => b - a)

console.log([true, false, true, false].sort((a, b) => b - a));

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