Angenommen, ich habe ein Objekt:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Ich möchte ein anderes Objekt erstellen, indem ich das obige Objekt filtere, damit ich so etwas habe.
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Ich suche nach einem sauberen Weg, um dies mit Es6 zu erreichen, sodass mir Spread-Operatoren zur Verfügung stehen.
filter
ecmascript-6
29er
quelle
quelle
Antworten:
Wenn Sie eine Liste zulässiger Werte haben, können Sie diese einfach in einem Objekt beibehalten, indem Sie:
Dies verwendet:
Object.keys
um dann alle Eigenschaften inraw
(den Originaldaten) aufzulistenArray.prototype.filter
um Schlüssel auszuwählen, die in der zulässigen Liste vorhanden sind, mitArray.prototype.includes
um sicherzustellen, dass sie vorhanden sindArray.prototype.reduce
um ein neues Objekt nur mit den zulässigen Eigenschaften zu erstellen.Dadurch wird eine flache Kopie mit den zulässigen Eigenschaften erstellt (die Eigenschaften selbst werden jedoch nicht kopiert).
Sie können auch den Objektverteilungsoperator verwenden , um eine Reihe von Objekten zu erstellen, ohne sie zu mutieren (danke an rjerue für die Erwähnung ):
Wenn Sie aus Gründen der Trivia die unerwünschten Felder aus den Originaldaten entfernen möchten (was ich nicht empfehlen würde , da es sich um einige hässliche Mutationen handelt), können Sie die
includes
Prüfung wie folgt umkehren:Ich füge dieses Beispiel hinzu, um eine mutationsbasierte Lösung zu zeigen, empfehle jedoch nicht, sie zu verwenden.
quelle
Array.prototype.includes
ist nicht Teil von ES6. Es wurde in ECMAScript 2016 (ES7) eingeführt.Wenn Sie mit der Verwendung der ES6-Syntax einverstanden sind, ist dies der sauberste Weg, wie hier und hier angegeben :
newData
Enthält jetzt :Oder wenn Sie den Schlüssel als Zeichenfolge gespeichert haben:
Im letzteren Fall
[key]
wird in konvertiert,item2
aber da Sie eineconst
Zuweisung verwenden, müssen Sie einen Namen für die Zuweisung angeben._
repräsentiert einen Wegwerfwert.Allgemeiner:
Dies reduziert nicht nur Ihren Betrieb auf einen Einzeiler, sondern erfordert auch nicht, dass Sie die anderen Schlüssel kennen (die, die Sie beibehalten möchten).
quelle
_
stellt einen Wegwerfwert dar" woher kommt das? Zum ersten Mal sehe ich es_
ist einfach ein gültiger Variablenname, der in JS verwendet werden kann. Da er jedoch so gut wie namenlos ist, sollte er nicht auf diese Weise verwendet werden, wenn Sie Absichten vermitteln möchten. Es wurde also verwendet, um eine Variable zu kennzeichnen, die Sie nicht interessieren. Hier ist eine weitere Diskussion darüber: stackoverflow.com/questions/11406823/…filter
undreduce
._
spielt keine Rolle, es ist nur ein Variablenname, Sie können es in alles umbenennen, was Sie wollenomit
Funktion von lodash verwenden : lodash.com/docs/4.17.10#omit oder eine der anderen hier angegebenen Lösungen.Der sauberste Weg, den Sie finden können, ist mit Lodash # pick
quelle
Nichts, was vorher nicht gesagt wurde, aber um einige Antworten auf eine allgemeine ES6-Antwort zu kombinieren:
quelle
Nur eine weitere Lösung in einer Zeile von Modern JS ohne externe Bibliotheken .
Ich habe mit der Funktion " Destructuring " gespielt:
quelle
var myNewRaw = (({ item1, item3}) => ({ item1, item3 }))(raw);
SyntaxproblemSie können es jetzt kürzer und einfacher machen, indem Sie die Object.fromEntries- Methode verwenden (überprüfen Sie die Browserunterstützung):
Lesen Sie mehr über: Object.fromEntries
quelle
Sie können ein Generikum hinzufügen
ofilter
(implementiert mit Generikaoreduce
), damit Sie Objekte auf die gleiche Weise wie Arrays filtern können.Wir können sehen, dass es hier funktioniert -
Überprüfen Sie die Ergebnisse in Ihrem eigenen Browser unten -
Code-Snippet anzeigen
Diese beiden Funktionen können auf viele Arten implementiert werden. Ich habe mich entschieden, an der
Array.prototype.reduce
Innenseite zu befestigen,oreduce
aber Sie könnten genauso gut alles von Grund auf neu schreibenquelle
oreduce
dem erstenacc
wird beschattet in.reduce(acc, k)
und inofilter
dero
abgeschattet wird -oreduce
mit einer Variablen namens heißto
auch - was das ist?ofilter
der Variableno
ist schattiert, zeigt aber immer auf dieselbe Eingabevariable; Deshalb ist es hier beschattet, weil es dasselbe ist - der Akkumulator (acc
) ist auch beschattet, weil er deutlicher zeigt, wie sich die Daten durch das Lambda bewegen.acc
ist nicht immer die gleiche Bindung , aber es repräsentiert immer den aktuellen persistenten Zustand des Rechenergebnisses, das wir zurückgeben möchtenSo habe ich es kürzlich gemacht:
quelle
Object.assign == ...
Du könntest schreibenconst dummyObj = { ...obj }
undconst target = { ...dummyObj }
. Letzteres ist überhaupt nicht notwendig, da Sie danach direkt mit dummyObj arbeiten können.ok, wie wäre es mit diesem Einzeiler
quelle
Die Antworten hier sind definitiv geeignet, aber sie sind etwas langsam, da sie die Whitelist für jede Eigenschaft im Objekt durchlaufen müssen. Die folgende Lösung ist für große Datenmengen viel schneller, da die Whitelist nur einmal durchlaufen wird:
quelle
Huckepack auf ssubes Antwort .
Hier ist eine wiederverwendbare Version.
Um es zu nennen, verwenden Sie
Das Schöne an den ES6-Pfeilfunktionen ist, dass Sie keinen
allowed
Parameter übergeben müssen.quelle
Sie können so etwas tun:
Dies funktioniert, ist aber nicht sehr klar, und die
with
Anweisung wird nicht empfohlen ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).quelle
Eine einfachere Lösung ohne Verwendung
filter
kann mitObject.entries()
statt erreicht werdenObject.keys()
quelle
Es gibt viele Möglichkeiten, dies zu erreichen. Die akzeptierte Antwort verwendet einen Keys-Filter-Reduce-Ansatz, der nicht besonders leistungsfähig ist.
Stattdessen mit einer
for...in
Schleife zu Schleife durch Tasten eines Objekt oder die zulässigen Tasten Schleifen, und dann ein neues Objekt bildet , ist ~ 50% leistungsfähiger ein .ein. In jsPerf finden Sie die Benchmarks eines einfachen Anwendungsfalls. Die Ergebnisse unterscheiden sich je nach Browser.
quelle
Sie können einen bestimmten Schlüssel für Ihr Objekt entfernen
quelle
quelle
Einfacher Weg! Um dies zu tun.
quelle
Eine andere Lösung mit der "neuen"
Array.reduce
Methode:Demonstration in dieser Geige ...
Aber ich mag die Lösung in dieser Antwort hier, die verwendet und :
Object.fromEntries
Array.filter
Array.includes
Demonstration in dieser Geige ...
quelle
OK, wie wäre es damit:
und nenne es so:
quelle
Diese Funktion filtert ein Objekt basierend auf einer Liste von Schlüsseln. Dies ist effizienter als die vorherige Antwort, da Array.filter vor dem Aufruf von reduct nicht verwendet werden muss. also ist es O (n) im Gegensatz zu O (n + gefiltert)
quelle
Geben Sie während der Schleife nichts zurück, wenn bestimmte Eigenschaften / Schlüssel angetroffen werden, und fahren Sie mit dem Rest fort:
quelle
Ich bin überrascht, wie noch niemand dies vorgeschlagen hat. Es ist super sauber und sehr explizit darüber, welche Schlüssel Sie behalten möchten.
Oder wenn Sie einen schmutzigen Einzeiler wollen:
quelle
Ein anderer Ansatz wäre die Verwendung
Array.prototype.forEach()
alsEs enthält nur Werte der Schlüssel, die in den Rohdaten verfügbar sind, und verhindert so das Hinzufügen von Junk-Daten.
quelle
Das wäre meine Lösung:
quelle