it-swarm.com.de

Javascript sortiert ein Array von Objekten nach einer booleschen Eigenschaft

Siehe Bearbeitung am Ende für das aktuelle Problem.

Ok, ich habe dieses Szenario:

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]

Wenn ich das mache:

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

Es gibt mir das:

[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]

Es macht irgendwie eine Art ... aber nicht ganz ... :(

Wie sortiere ich dieses Array?

BEARBEITEN:

Wenn Sie sich fragen, warum ich nicht nur a.sort () verwendet habe, weil mein tatsächliches Array aus Objekten besteht und kein einfaches Array wie das, das ich veröffentlicht habe. Das echte hat Elemente, die aussehen wie [{xx: true}, {xx: false}, ...]

51
PCoelho
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);

Sie müssen 0 zurückgeben, wenn a und b denselben Wert haben, -1, wenn a wahr ist, und 1, wenn dies nicht der Fall ist.

131
c.P.u1

ein einfacher Weg:

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);

sie können a.reverse () nach sort () aufrufen, wenn Sie möchten, dass es anders sortiert wird.

BEARBEITEN: Überarbeitet, um die aktualisierte Frage des Sortierens eines Arrays von Objekten anstelle eines Arrays von Booleschen Werten widerzuspiegeln.

27
dandavis

Einfache Lösung:

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

Um eine implizite Typkonvertierung zu verhindern (welche Sprachen wie TypeScript nicht mögen), können Sie Number() verwenden, um den Booleschen Wert explizit in eine Zahl zu konvertieren:

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);

Oder mit Pfeilfunktionen:

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);
5
sroes

PFB die Lösung funktionierte auch in TypeScript Angular 2,

  let a = [{aa:"1",xx:true},{aa:"10",xx:false},{aa:"2",xx:true},{aa:"11",xx:false},{aa:"3",xx:true},{aa:"12",xx:false},{aa:"4",xx:true},{aa:"13",xx:false},{aa:"5",xx:true},{aa:"14",xx:false},{aa:"6",xx:true},{aa:"15",xx:false},{aa:"7",xx:true},{aa:"16",xx:false},{aa:"8",xx:true},{aa:"17",xx:false},{aa:"9",xx:true},{aa:"18",xx:false}];

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

Ein Array hat keine gleichen Positionen. Lassen Sie also die Gleichheitsüberprüfung weg und geben Sie immer entweder -1 oder 1 zurück. Dieser Ansatz funktioniert gut mit TS.

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

Hinweis: Ich bin etwas besorgt, wie sich dies auf Interna der Sortierfunktion auswirkt, aber es scheint den Trick zu tun.

Wenn Sie die Sortierung umkehren möchten

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

Eine ziemlich einfache Lösung für die Vergleichsfunktion besteht darin, zu prüfen, ob a < b, dies ergibt 0 oder 1, wenn es in eine Zahl umgewandelt wird. Wir wollen dann 0 auf -1 und 1 auf 1 abbilden. Dazu können Sie einfach mit 2 multiplizieren und dann 1 subtrahieren.

data.sort(function (a, b) {
  return (a < b) * 2 - 1
}

oder nur

data.sort((a, b) => (a < b) * 2 - 1)

Problem sortiert!

Wenn einer Ihrer Werte null ist, werden sie als falsch behandelt (null*2 === 0) und jeder Wert, der undefined ist, wird NaN (undefined*2 === NaN) was es dauern sollte in beiden Sortierrichtungen.

0
MattClimbs