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 sortieren? last_nom
in Javascript?
ich weiss Bescheid sort(a,b)
, aber das scheint nur bei Strings und Zahlen zu funktionieren. Muss ich eine hinzufügen toString()
Methode zu meinen Objekten?
Sie können auch eine dynamische Sortierfunktion erstellen, die Objekte nach ihrem übergebenen Wert sortiert:
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 folgt haben:
var People = [
{Name: "Name", Surname: "Surname"},
{Name:"AAA", Surname:"ZZZ"},
{Name: "Name", Surname: "AAA"}
];
… und es wird funktionieren, wenn Sie Folgendes tun:
People.sort(dynamicSort("Name"));
People.sort(dynamicSort("Surname"));
People.sort(dynamicSort("-Surname"));
Eigentlich ist die Frage damit schon beantwortet. Der folgende Teil ist geschrieben, weil viele Leute mich kontaktiert haben und sich darüber beschwert haben, dass es mit mehreren Parametern nicht funktioniert.
Mehrere Parameter
Sie können die folgende Funktion verwenden, um Sortierfunktionen mit mehreren Sortierparametern zu generieren.
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;
}
}
Was es Ihnen ermöglichen würde, so etwas zu tun:
People.sort(dynamicSortMultiple("Name", "-Surname"));
Unterklassen-Array
Für die Glücklichen unter uns, die ES6 verwenden können, wodurch die nativen Objekte erweitert werden können:
class MyArray extends Array {
sortBy(...args) {
return this.sort(dynamicSortMultiple(...args));
}
}
Das würde dies ermöglichen:
MyArray.from(People).sortBy("Name", "-Surname");
unterstrich.js
Verwenden Sie den Unterstrich, es ist klein und großartig …
sortBy_.sortBy(Liste, Iterator, [context]) Gibt eine sortierte Kopie der Liste zurück, die in aufsteigender Reihenfolge nach den Ergebnissen der Ausführung jedes Werts durch den Iterator angeordnet ist. Iterator kann auch der Stringname der Eigenschaft 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' );
Wenn Sie doppelte Nachnamen haben, können Sie diese nach Vornamen sortieren.
obj.sort(function(a,b){
if(a.last_nom< b.last_nom) return -1;
if(a.last_nom >b.last_nom) return 1;
if(a.first_nom< b.first_nom) return -1;
if(a.first_nom >b.first_nom) return 1;
return 0;
});
Groß- und Kleinschreibung beachten
arr.sort((a, b) => a.name > b.name ? 1 : -1);
Groß-/Kleinschreibung wird nicht beachtet
arr.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1);
Nützlicher Hinweis
Wenn sich die Reihenfolge nicht ändert (bei gleichen Zeichenfolgen), dann die Bedingung >
wird scheitern und -1
Wird zurückgegeben. Wenn die Zeichenfolgen jedoch gleich sind, führt die Rückgabe von 1 oder -1 zu einer korrekten Ausgabe
Die andere Option könnte sein, zu verwenden >=
Betreiber statt >
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 sorter3 - passed param sortBy='last_nom'", objs);
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/sorting_things.html
– Baversjö
15. Juli 2009 um 3:31 Uhr
Am schnellsten geht es mit der Isomorphie sort-array Modul, das sowohl im Browser als auch im Knoten nativ funktioniert und alle Arten von Eingaben, berechneten Feldern und benutzerdefinierten Sortierreihenfolgen unterstützt.
– Lloyd
21. Oktober 2019 um 20:25 Uhr
Funktion vergleichen ( a, b ) { if ( a.last_nom < b.last_nom ) { return -1; } if ( a.last_nom > b.last_nom ) {Rückgabe 1; } Rückgabe 0; } objs.sort (vergleichen);
– Ali NajafZadeh
3. August 2021 um 16:56 Uhr
objs.sort((a,b) => (a.last_nom > b.last_nom) ? 1 : ((b.last_nom > a.last_nom) ? -1 : 0))
– Ali NajafZadeh
3. August 2021 um 16:56 Uhr
@RobertTalada, es ist meine Antwort stackoverflow.com/a/67021585/7012450
– artem
5. November 2021 um 6:18 Uhr