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

87voto

kennebec Punkte 98551

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

0 Stimmen

@BadFeelingAboutThis Was bedeutet es, entweder -1 oder 1 zurückzugeben? Ich verstehe, dass -1 buchstäblich bedeutet, dass A weniger als B ist, nur durch die Syntax, aber warum eine 1 oder -1 verwenden? Ich sehe, dass jeder diese Zahlen als Rückgabewerte verwendet, aber warum? Danke!

1 Stimmen

@Chris22 eine negative Zahl zurückgegeben bedeutet, dass b sollte kommen nach a in dem Array. Wenn eine positive Zahl zurückgegeben wird, bedeutet dies a sollte kommen nach b . Si 0 zurückgegeben wird, bedeutet dies, dass sie als gleichwertig betrachtet werden. Sie können jederzeit die Dokumentation lesen: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/

1 Stimmen

@BadFeelingAboutThis danke, für die Erklärung und den Link. Ob du es glaubst oder nicht, ich habe verschiedene Codeschnipsel gegoogelt und den 1, 0, -1 bevor ich diese Frage hier gestellt habe. Ich habe einfach nicht die Informationen gefunden, die ich brauchte.

69voto

Vinay Aggarwal Punkte 1447

Eine einfache und schnelle Lösung für dieses Problem ist die Vererbung von Prototypen:

Array.prototype.sortBy = function(p) {
  return this.slice(0).sort(function(a,b) {
    return (a[p] > b[p]) ? 1 : (a[p] < b[p]) ? -1 : 0;
  });
}

Beispiel/Verwendung

objs = [{age:44,name:'vinay'},{age:24,name:'deepak'},{age:74,name:'suresh'}];

objs.sortBy('age');
// Returns
// [{"age":24,"name":"deepak"},{"age":44,"name":"vinay"},{"age":74,"name":"suresh"}]

objs.sortBy('name');
// Returns
// [{"age":24,"name":"deepak"},{"age":74,"name":"suresh"},{"age":44,"name":"vinay"}]

Aktualisierung: Das ursprüngliche Array wird nicht mehr verändert.

8 Stimmen

Es gibt nicht einfach ein anderes Array zurück, sondern sortiert das ursprüngliche!

1 Stimmen

Wenn Sie sicherstellen wollen, dass Sie eine natürliche Sortierung mit Zahlen verwenden (z.B. 0,1,2,10,11 etc...), verwenden Sie parseInt mit dem Radix-Set. developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/ also: return (parseInt(a[p],10) > parseInt(b[p],10)) ? 1 : (parseInt(a[p],10) < parseInt(b[p],10)) ? -1 : 0;

0 Stimmen

@codehuntr Danke für die Korrektur. aber ich denke, anstatt eine Sortierfunktion zu machen, um diese Sensibilisierung zu tun, ist es besser, wenn wir eine separate Funktion machen, um Datentypen zu fixieren. Denn die Sortierfunktion kann nicht sagen, welche Eigenschaft welche Art von Daten enthält :)

43voto

Harshal Y. Punkte 4467

Sie können verwenden Der einfachste Weg: Lodash

( https://lodash.com/docs/4.17.10#orderBy )

Diese Methode ist wie _.sortBy mit dem Unterschied, dass die Sortierreihenfolge der zu sortierenden Iteratees angegeben werden kann. Wenn orders nicht angegeben ist, werden alle Werte in aufsteigender Reihenfolge sortiert. Andernfalls geben Sie eine Reihenfolge von "desc" für absteigende oder "asc" für aufsteigende Sortierreihenfolge der entsprechenden Werte an.

Argumente

Sammlung (Array|Objekt): Die Sammlung, über die iteriert werden soll. [iteratees=[_.identity]] (Array[]|Funktion[]|Object[]|string[]): Die Iteratees, nach denen sortiert werden soll. [orders] (string[]): Die Sortierreihenfolge der Iteratees.

Rückgabe

(Array): Gibt das neue sortierte Array zurück.


var _ = require('lodash');
var homes = [
    {"h_id":"3",
     "city":"Dallas",
     "state":"TX",
     "zip":"75201",
     "price":"162500"},
    {"h_id":"4",
     "city":"Bevery Hills",
     "state":"CA",
     "zip":"90210",
     "price":"319250"},
    {"h_id":"6",
     "city":"Dallas",
     "state":"TX",
     "zip":"75000",
     "price":"556699"},
    {"h_id":"5",
     "city":"New York",
     "state":"NY",
     "zip":"00010",
     "price":"962500"}
    ];

_.orderBy(homes, ['city', 'state', 'zip'], ['asc', 'desc', 'asc']);

36voto

Christoph Punkte 157217

Anstatt eine benutzerdefinierte Vergleichsfunktion zu verwenden, können Sie auch einen Objekttyp mit benutzerdefinierter toString() Methode (die von der Standardvergleichsfunktion aufgerufen wird):

function Person(firstName, lastName) {
    this.firtName = firstName;
    this.lastName = lastName;
}

Person.prototype.toString = function() {
    return this.lastName + ', ' + this.firstName;
}

var persons = [ new Person('Lazslo', 'Jamf'), ...]
persons.sort();

32voto

Abhishek Punkte 533

Versuchen Sie dies,

UPTO ES5

//Ascending Sort
items.sort(function (a, b) {
   return a.value - b.value;
});

//Descending Sort
items.sort(function (a, b) {
   return b.value - a.value;
});

IN ES6 & above:

// Ascending sort
items.sort((a, b) => a.value - b.value);

// Descending Sort
 items.sort((a, b) => b.value - a.value);

2 Stimmen

Beste und einfache Lösung

2 Stimmen

Funktioniert bei mir nicht, ich habe andere Lösungen ausprobiert, die tatsächlich funktionieren, aber diese hier nicht. Versucht, nach Zeichenketten zu sortieren.

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