4000 Stimmen

Array von Objekten nach String-Eigenschaftswert sortieren

Ich habe ein Array von JavaScript-Objekten:

var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

Wie kann ich sie nach dem Wert von last_nom in JavaScript?

Ich weiß von sort(a,b) aber das scheint nur bei Strings und Zahlen zu funktionieren. Muss ich ein toString() Methode für meine Objekte?

8 Stimmen

Mit diesem Skript können Sie genau das tun, es sei denn, Sie möchten Ihre eigene Vergleichsfunktion oder Ihren eigenen Sortierer schreiben: thomasfrank.se/sortierung_der-dinge.html

0 Stimmen

Der schnellste Weg ist die Verwendung der isomorphen sort-array Modul, das nativ sowohl im Browser als auch im Node funktioniert und jede Art von Eingabe, berechnete Felder und benutzerdefinierte Sortierreihenfolgen unterstützt.

0 Stimmen

Function compare( a, b ) { if ( a.last_nom < b.last_nom ){ return -1; } if ( a.last_nom > b.last_nom ){ return 1; } return 0; } objs.sort( compare );

5527voto

Wogan Punkte 63411

Es ist einfach genug, eine eigene Vergleichsfunktion zu schreiben:

function compare( a, b ) {
  if ( a.last_nom < b.last_nom ){
    return -1;
  }
  if ( a.last_nom > b.last_nom ){
    return 1;
  }
  return 0;
}

objs.sort( compare );

Oder Inline (c/o Marco Demaio):

objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))

Oder vereinfacht für numerisch (c/o Andre Figueiredo):

objs.sort((a,b) => a.last_nom - b.last_nom); // b - a for reverse sort

553 Stimmen

Oder inline: objs.sort(function(a,b) {return (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0);} );

45 Stimmen

293 Stimmen

return a.last_nom.localeCompare(b.last_nom) wird auch funktionieren.

1080voto

Ege Özcan Punkte 13261

Sie können auch eine dynamische Sortierfunktion erstellen, die Objekte nach ihrem Wert sortiert, den Sie übergeben:

function dynamicSort(property) {
    var sortOrder = 1;
    if(property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a,b) {
        /* next line works with strings and numbers, 
         * and you may want to customize it to your needs
         */
        var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}

Sie können also ein Array von Objekten wie dieses haben:

var People = [
    {Name: "Name", Surname: "Surname"},
    {Name:"AAA", Surname:"ZZZ"},
    {Name: "Name", Surname: "AAA"}
];

...und es wird funktionieren, wenn Sie es tun:

People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));

Damit ist die Frage eigentlich schon beantwortet. Der folgende Teil wurde geschrieben, weil viele Leute mich kontaktiert haben und sich beschwerten, dass es funktioniert nicht mit mehreren Parametern .

Mehrere Parameter

Sie können die folgende Funktion verwenden, um Sortierfunktionen mit mehreren Sortierparametern zu erzeugen.

function dynamicSortMultiple() {
    /*
     * save the arguments object as it will be overwritten
     * note that arguments object is an array-like object
     * consisting of the names of the properties to sort by
     */
    var props = arguments;
    return function (obj1, obj2) {
        var i = 0, result = 0, numberOfProperties = props.length;
        /* try getting a different result from 0 (equal)
         * as long as we have extra properties to compare
         */
        while(result === 0 && i < numberOfProperties) {
            result = dynamicSort(props[i])(obj1, obj2);
            i++;
        }
        return result;
    }
}

Das würde Ihnen ermöglichen, etwas wie dies zu tun:

People.sort(dynamicSortMultiple("Name", "-Surname"));

Unterklassifizierung von Array

Für die Glücklichen unter uns, die ES6 verwenden können, das die Erweiterung der nativen Objekte ermöglicht:

class MyArray extends Array {
    sortBy(...args) {
        return this.sort(dynamicSortMultiple(...args));
    }
}

Das würde dies ermöglichen:

MyArray.from(People).sortBy("Name", "-Surname");

9 Stimmen

Schön. Es gibt jetzt eine Typescript-Version dieser Antwort: stackoverflow.com/a/68279093/8910547 . Bleiben Sie (typ)sicher!

0 Stimmen

Sie sollten Array niemals verlängern.

4 Stimmen

@zero_cool Array wird hier nicht erweitert (der Prototyp bleibt derselbe), es wird erweitert von. Man sollte in der Tat nicht den Prototyp von nativen Objekten ändern, aber wie ich schon sagte, ist das nicht das, was hier passiert.

985voto

Vlad Bezden Punkte 71128

In ES6/ES2015 oder später können Sie dies auf diese Weise tun:

objs.sort((a, b) => a.last_nom.localeCompare(b.last_nom));

Vor ES6/ES2015

objs.sort(function(a, b) {
    return a.last_nom.localeCompare(b.last_nom)
});

42 Stimmen

Dies ist seit JS 1.1 verfügbar, der fette Pfeil Stück dazu ist die ES6/2015 Stück. Aber immer noch sehr nützlich, und die beste Antwort meiner Meinung nach

25 Stimmen

@PratikKelwalkar: Wenn Sie es umkehren müssen, wechseln Sie einfach den Vergleich von a und b: objs.sort((a, b) => b.last_nom.localeCompare(a.last_nom));

0 Stimmen

Wenn die Werte numerisch sind, brauchen Sie keine localeCompare . Sie können die Standard > Operator - wie in der Antwort von @muasif80 erwähnt - stackoverflow.com/a/67992215/6908282

240voto

David Morrow Punkte 8043

unterstrich.js

Verwenden Sie Unterstrich, seine kleine und awesome...

sortBy_.sortBy(list, iterator, [context]) Gibt eine sortierte Kopie von list zurück, die in aufsteigender Reihenfolge nach den Ergebnissen des Durchlaufs der einzelnen Werte sortiert ist durch Iterator. Iterator kann auch der Stringname der Eigenschaft sein sein, nach der sortiert werden soll (z. B. Länge).

var objs = [ 
  { first_nom: 'Lazslo',last_nom: 'Jamf' },
  { first_nom: 'Pig', last_nom: 'Bodine'  },
  { first_nom: 'Pirate', last_nom: 'Prentice' }
];

var sortedObjs = _.sortBy( objs, 'first_nom' );

23 Stimmen

David, könnten Sie die Antwort dahingehend ändern, dass sie lautet, var sortedObjs = _.sortBy( objs, 'first_nom' ); . objs wird no wird dadurch selbst sortiert. Die Funktion wird return ein sortiertes Array. Das würde es deutlicher machen.

13 Stimmen

Umgekehrt sortieren: var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();

2 Stimmen

Sie müssen die Javascript-Bibliothek "underscore" laden: <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8‌​.3/underscore-min.js‌​"> </script>

136voto

muasif80 Punkte 4588

Groß- und Kleinschreibung

arr.sort((a, b) => a.name > b.name ? 1 : -1);

Groß-/Kleinschreibung nicht beachten

arr.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1);

Nützlicher Hinweis

Wenn sich die Reihenfolge nicht ändert (bei gleichen Strings), gilt die Bedingung > wird scheitern und -1 zurückgegeben werden. Wenn die Zeichenketten jedoch gleich sind, führt die Rückgabe von 1 oder -1 zu einer korrekten Ausgabe

Die andere Möglichkeit wäre die Verwendung von >= Operator anstelle von >


var objs = [ 
    { first_nom: 'Lazslo', last_nom: 'Jamf'     },
    { first_nom: 'Pig',    last_nom: 'Bodine'   },
    { first_nom: 'Pirate', last_nom: 'Prentice' }
];

// Define a couple of sorting callback functions, one with hardcoded sort key and the other with an argument sort key
const sorter1 = (a, b) => a.last_nom.toLowerCase() > b.last_nom.toLowerCase() ? 1 : -1;
const sorter2 = (sortBy) => (a, b) => a[sortBy].toLowerCase() > b[sortBy].toLowerCase() ? 1 : -1;

objs.sort(sorter1);
console.log("Using sorter1 - Hardcoded sort property last_name", objs);

objs.sort(sorter2('first_nom'));
console.log("Using sorter2 - passed param sortBy='first_nom'", objs);

objs.sort(sorter2('last_nom'));
console.log("Using sorter2 - passed param sortBy='last_nom'", objs);

0 Stimmen

Die Unterscheidung zwischen Groß- und Kleinschreibung ist eine gute Kurzform - vor allem, wenn die Werte numerisch oder datumsbezogen sind.

0 Stimmen

TIPP: Wenn Sie die Reihenfolge umkehren möchten, können Sie einfach die -1 y 1 z.B.: von 1 : -1 zu -1 : 1

0 Stimmen

Wie wäre es mit einer Änderung (a, b) to (b, a) :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X