Kennt jemand eine (wenn möglich auch lodash) Möglichkeit, ein Array von Objekten nach einem Objektschlüssel zu gruppieren und dann basierend auf der Gruppierung ein neues Array von Objekten zu erstellen? Zum Beispiel habe ich eine Reihe von Autoobjekten:
var cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
}, {
'make': 'audi',
'model': 'rs5',
'year': '2013'
}, {
'make': 'ford',
'model': 'mustang',
'year': '2012'
}, {
'make': 'ford',
'model': 'fusion',
'year': '2015'
}, {
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
Ich möchte eine neue Reihe von Autoobjekten erstellen, die gruppiert sind nach make
:
var cars = {
'audi': [
{
'model': 'r8',
'year': '2012'
}, {
'model': 'rs5',
'year': '2013'
},
],
'ford': [
{
'model': 'mustang',
'year': '2012'
}, {
'model': 'fusion',
'year': '2015'
}
],
'kia': [
{
'model': 'optima',
'year': '2012'
}
]
}
groupBy
?Antworten:
Timos Antwort ist, wie ich es machen würde. Einfach
_.groupBy
und einige Duplikate in den Objekten in der gruppierten Struktur zulassen.Das OP forderte
make
jedoch auch die Entfernung der doppelten Schlüssel. Wenn Sie den ganzen Weg gehen wollten:Ausbeuten:
Wenn Sie dies mit Underscore.js tun möchten, beachten Sie, dass die Version von
_.mapValues
aufgerufen wird_.mapObject
.quelle
In einfachem Javascript können Sie
Array#reduce
mit einem Objekt verwendenquelle
result
Ergebnisse iterieren ?Object.entries
und die Schlüssel / Wert-Paare durchlaufen.make
einmal gruppierten Datensatz zu entfernen ? Es braucht zusätzlichen Platz.Sie suchen
_.groupBy()
.Das Entfernen der Eigenschaft, nach der Sie gruppieren, aus den Objekten sollte bei Bedarf trivial sein:
Als Bonus erhalten Sie mit ES6-Pfeilfunktionen eine noch schönere Syntax:
quelle
var grouped = _.groupBy(cars, 'make');
brauchen Sie überhaupt keine Funktion, wenn der Accessor ein einfacher Eigenschaftsname ist.Die Kurzversion zum Gruppieren eines Arrays von Objekten nach einem bestimmten Schlüssel in es6:
Die längere Version:
Es scheint, dass die ursprüngliche Frage fragt, wie Autos nach Marke gruppiert werden sollen, aber die Marke in jeder Gruppe weggelassen wird. Die Antwort würde also so aussehen:
quelle
Hier ist Ihre eigene
groupBy
Funktion, die eine Verallgemeinerung des Codes von: https://github.com/you-dont-need/You-Dont-Need-Lodash-Underscore istquelle
quelle
Ich würde
REAL GROUP BY
für JS Arrays Beispiel genau die gleiche Aufgabe hier lassenquelle
Sie können versuchen, das Objekt innerhalb der von _.groupBy func pro Iteration aufgerufenen Funktion zu ändern. Beachten Sie, dass das Quell-Array seine Elemente ändert!
quelle
make
Eigenschaft zu verwenden, und sie ist auch besser lesbar.Es ist auch mit einer einfachen
for
Schleife möglich:quelle
for ( let { TABLE_NAME, ...fields } of source) { result[TABLE_NAME] = result[TABLE_NAME] || []; result[TABLE_NAME].push({ ...fields }); }
In Fällen, in denen der Schlüssel null sein kann und wir sie als andere gruppieren möchten
quelle
Erstellen Sie eine Methode, die wiederverwendet werden kann
Dann können Sie unten nach beliebigen Kriterien gruppieren
quelle
Prototyp-Version auch mit ES6. Grundsätzlich verwendet dies die Reduktionsfunktion, um einen Akkumulator und ein aktuelles Element zu übergeben, die dann verwendet werden, um Ihre "gruppierten" Arrays basierend auf dem übergebenen Schlüssel zu erstellen. Der innere Teil der Reduzierung mag kompliziert aussehen, aber im Wesentlichen wird geprüft, ob der Schlüssel des übergebenen Objekts vorhanden ist. Wenn dies nicht der Fall ist, wird ein leeres Array erstellt und das aktuelle Element an das neu erstellte Array angehängt, andernfalls wird der Spread verwendet Der Operator übergibt alle Objekte des aktuellen Schlüsselarrays und hängt das aktuelle Element an. Hoffe das hilft jemandem!.
quelle
Sie können auch eine
array#forEach()
Methode wie die folgende verwenden:quelle
quelle
Probieren Sie es einfach aus, es funktioniert gut für mich.
let grouped = _.groupBy(cars, 'make');
quelle
Ich habe einen Benchmark erstellt, um die Leistung jeder Lösung zu testen, die keine externen Bibliotheken verwendet.
JSBen.ch
Die
reduce()
von @Nina Scholz gepostete Option scheint die optimale zu sein.quelle
Ich mochte die @ metakunfu-Antwort, aber sie liefert nicht genau die erwartete Ausgabe. Hier ist eine Aktualisierung, die "make" in der endgültigen JSON-Nutzlast entfernt.
Ausgabe:
quelle
Mit lodash / fp können Sie eine Funktion mit
_.flow()
diesen ersten Gruppen durch einen Schlüssel erstellen , dann jede Gruppe zuordnen und einen Schlüssel aus jedem Element weglassen:quelle
Aufbauend auf der Antwort von @Jonas_Wilms, wenn Sie nicht alle Ihre Felder eingeben möchten:
Ich habe keinen Benchmark erstellt, aber ich glaube, dass die Verwendung einer for-Schleife effizienter ist als alles, was in dieser Antwort vorgeschlagen wird .
quelle
quelle
Gruppiertes Array von Objekten in Typoskript mit diesem:
quelle
Ich liebe es, es ohne Abhängigkeit / Komplexität zu schreiben, nur reine einfache js.
quelle
Hier ist eine andere Lösung dafür. Wie gewünscht.
Ausgabe:
quelle
Hier ist eine Lösung, die von Collectors.groupingBy () in Java inspiriert wurde:
Dies ergibt ein Kartenobjekt.
quelle