Array von Objekten nach String-Eigenschaftswert sortieren

Lesezeit: 7 Minuten

Array von Objekten nach String Eigenschaftswert sortieren
Tyrone Faultier

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?

  • 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

Array von Objekten nach String Eigenschaftswert sortieren
Ege Özcan

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

  • Hübsch. Es gibt jetzt eine Typescript-Version dieser Antwort: stackoverflow.com/a/68279093/8910547. Bleiben Sie (typ)sicher! 😉

    – Inigo

    7. Juli 2021 um 2:30 Uhr

  • Dies ist seit JS 1.1 verfügbar, das dicke Pfeilstück dazu ist das ES6/2015-Stück. Aber immer noch sehr nützlich und meiner Meinung nach die beste Antwort

    – Jon Harding

    22. Februar 2016 um 20:30 Uhr

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

    – Vlad Bezden

    26. Mai 2016 um 18:24 Uhr


  • Wenn die Werte numerisch sind, brauchen Sie sie nicht localeCompare. Sie können die Norm verwenden > operator – wie in der Antwort von @muasif80 erwähnt – stackoverflow.com/a/67992215/6908282

    – Gangula

    29. Oktober 2021 um 19:29 Uhr


1646885710 291 Array von Objekten nach String Eigenschaftswert sortieren
David Morgen

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

  • David, könnten Sie die Antwort bearbeiten, um zu sagen: var sortedObjs = _.sortBy( objs, 'first_nom' );. objs Wille nicht dadurch selbst sortiert werden. Die Funktion wird Rückkehr ein sortiertes Array. Das würde es deutlicher machen.

    – Jess

    9. Januar 2014 um 4:01 Uhr

  • Um die Sortierung umzukehren: var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();

    – Erdal G.

    31. Januar 2016 um 10:43 Uhr


  • Sie müssen die Javascript-Bibliothek “Unterstrich” laden: <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>

    – und-bri

    29. Mai 2017 um 18:28 Uhr


  • Auch erhältlich in Lodash für diejenigen, die das bevorzugen

    – WoJ

    17. April 2018 um 10:49 Uhr

  • In Lodash wäre dies dasselbe: var sortedObjs = _.sortBy( objs, 'first_nom' ); oder wenn Sie es in einer anderen Reihenfolge wünschen: var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );

    – Travis Heeter

    15. November 2018 um 19:10 Uhr

1646885711 189 Array von Objekten nach String Eigenschaftswert sortieren
Schlechtes Gefühl

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

  • David, könnten Sie die Antwort bearbeiten, um zu sagen: var sortedObjs = _.sortBy( objs, 'first_nom' );. objs Wille nicht dadurch selbst sortiert werden. Die Funktion wird Rückkehr ein sortiertes Array. Das würde es deutlicher machen.

    – Jess

    9. Januar 2014 um 4:01 Uhr

  • Um die Sortierung umzukehren: var reverseSortedObjs = _.sortBy( objs, 'first_nom' ).reverse();

    – Erdal G.

    31. Januar 2016 um 10:43 Uhr


  • Sie müssen die Javascript-Bibliothek “Unterstrich” laden: <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"> </script>

    – und-bri

    29. Mai 2017 um 18:28 Uhr


  • Auch erhältlich in Lodash für diejenigen, die das bevorzugen

    – WoJ

    17. April 2018 um 10:49 Uhr

  • In Lodash wäre dies dasselbe: var sortedObjs = _.sortBy( objs, 'first_nom' ); oder wenn Sie es in einer anderen Reihenfolge wünschen: var sortedObjs = _.orderBy( objs, ['first_nom'],['dsc'] );

    – Travis Heeter

    15. November 2018 um 19:10 Uhr

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

  • Der Ansatz mit Berücksichtigung der Groß-/Kleinschreibung ist eine gute Abkürzung – insbesondere, wenn die Werte numerisch oder Datum sind.

    – Gangula

    29. Oktober 2021 um 19:26 Uhr

  • TIPP: Wenn Sie die Bestellung umkehren möchten, können Sie einfach tauschen -1 und 1 zum Beispiel: von 1 : -1 zu -1 : 1

    – Gangula

    29. Oktober 2021 um 19:32 Uhr


  • Was ist mit dem Wechsel (a, b) to (b, a) 🙂

    – muasif80

    30. Oktober 2021 um 17:29 Uhr

  • Ja, das geht auch. Ich finde nur tauschen 1 & -1 direkter und logischer.

    – Gangula

    30. Oktober 2021 um 18:03 Uhr

986110cookie-checkArray von Objekten nach String-Eigenschaftswert sortieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy