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

13voto

cbdeveloper Punkte 21367

Dies ist meine Meinung dazu:

El order ist optional und steht standardmäßig auf "ASC" für aufsteigende Reihenfolge.

Arbeitet an Zeichen mit Akzent und Groß- und Kleinschreibung werden nicht berücksichtigt. .

HINWEIS: Es sortiert und liefert die ORIGINAL Array.

function sanitizeToSort(str) {
  return str
    .normalize('NFD')                   // REMOVE ACCENTED AND DIACRITICS
    .replace(/[\u0300-\u036f]/g,'')     // REMOVE ACCENTED AND DIACRITICS
    .toLowerCase()                      // SORT WILL BE CASE INSENSITIVE
  ;
}

function sortByProperty(arr, property, order="ASC") {
  arr.forEach((item) => item.tempProp = sanitizeToSort(item[property]));
  arr.sort((a,b) => order === "ASC" ?
      a.tempProp > b.tempProp ?  1 : a.tempProp < b.tempProp ? -1 : 0
    : a.tempProp > b.tempProp ? -1 : a.tempProp < b.tempProp ?  1 : 0
  );
  arr.forEach((item) => delete item.tempProp);
  return arr;
}

SNIPPET

function sanitizeToSort(str) {
  return str
    .normalize('NFD')                   // REMOVE ACCENTED CHARS
    .replace(/[\u0300-\u036f]/g,'')     // REMOVE DIACRITICS
    .toLowerCase()
  ;
}

function sortByProperty(arr, property, order="ASC") {
  arr.forEach((item) => item.tempProp = sanitizeToSort(item[property]));
  arr.sort((a,b) => order === "ASC" ?
      a.tempProp > b.tempProp ?  1 : a.tempProp < b.tempProp ? -1 : 0
    : a.tempProp > b.tempProp ? -1 : a.tempProp < b.tempProp ?  1 : 0
  );
  arr.forEach((item) => delete item.tempProp);
  return arr;
}

const rockStars = [
  { name: "Axl",
    lastname: "Rose" },
  { name: "Elthon",
    lastname: "John" },
  { name: "Paul",
    lastname: "McCartney" },
  { name: "Lou",
    lastname: "Reed" },
  { name: "freddie",             // WORKS ON LOWER/UPPER CASE
    lastname: "mercury" },
  { name: "Ámy",                 // WORKS ON ACCENTED CHARS TOO
    lastname: "winehouse"}

];

sortByProperty(rockStars,"name");

console.log("Ordered by name A-Z:");
rockStars.forEach((item) => console.log(item.name + " " + item.lastname));

sortByProperty(rockStars,"lastname","DESC");

console.log("\nOrdered by lastname Z-A:");
rockStars.forEach((item) => console.log(item.lastname + ", " + item.name));

0 Stimmen

Funktioniert nicht, wenn die Liste Namen in einer Kombination aus Groß- und Kleinbuchstaben enthält

0 Stimmen

@AnkeshPandey Vielen Dank für diesen Hinweis. Ich habe es behoben.

13voto

Caio Ladislau Punkte 1227

Ein einfacher Weg:

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

Siehe das '.toLowerCase()' ist notwendig, um Fehler zu vermeiden beim Vergleich von Zeichenketten zu vermeiden.

5 Stimmen

Sie könnten verwenden Pfeilfunktionen um den Code ein wenig eleganter zu gestalten: objs.sort( (a,b) => b.last_nom.toLowerCase() < a.last_nom.toLowerCase() );

0 Stimmen

Dies ist aus demselben Grund falsch, wie bereits erläutert aquí .

2 Stimmen

Pfeilfunktionen sind nicht ES5-tauglich. Tonnen von Motoren sind immer noch auf ES5 beschränkt. In meinem Fall finde ich die Antwort oben deutlich besser, da ich auf einer ES5-Engine bin (gezwungen durch mein Unternehmen)

13voto

Roshni Bokade Punkte 333

Warnung!
Die Verwendung dieser Lösung ist nicht empfohlen da es nicht zu einem sortierten Array führt. Sie wird hier als Referenz für die Zukunft belassen, weil die Idee nicht selten ist.

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

3 Stimmen

Es schien nicht zu funktionieren, ich musste die akzeptierte Antwort verwenden. Es wurde nicht richtig sortiert.

12voto

Behnam Shomali Punkte 843

Zusätzliche desc-Parameter für Ege Özcan Code

function dynamicSort(property, desc) {
    if (desc) {
        return function (a, b) {
            return (a[property] > b[property]) ? -1 : (a[property] < b[property]) ? 1 : 0;
        }   
    }
    return function (a, b) {
        return (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
    }
}

1 Stimmen

Wofür steht "desc"? "absteigend" ? "Deskriptor" ? Etwas anderes?

12voto

Francois Girard Punkte 310

Eine einfache Funktion, die ein Array von Objekten nach einer Eigenschaft sortiert

function sortArray(array, property, direction) {
    direction = direction || 1;
    array.sort(function compare(a, b) {
        let comparison = 0;
        if (a[property] > b[property]) {
            comparison = 1 * direction;
        } else if (a[property] < b[property]) {
            comparison = -1 * direction;
        }
        return comparison;
    });
    return array; // Chainable
}

Verwendung:

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

sortArray(objs, "last_nom"); // Asc
sortArray(objs, "last_nom", -1); // Desc

0 Stimmen

Diese Lösung hat bei mir perfekt funktioniert, um bidirektional zu sortieren. Danke u

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