Was ist eine gute und kurze Möglichkeit, einen Wert mit einem bestimmten Schlüssel aus einem Objekt zu entfernen, ohne das ursprüngliche Objekt zu mutieren?
Ich möchte etwas tun wie:
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
Ich weiß, dass es für solche Aufgaben viele Unveränderlichkeitsbibliotheken gibt, aber ich würde gerne ohne Bibliothek davonkommen. Um dies zu tun, wäre es jedoch erforderlich, einen einfachen und kurzen Weg zu haben, der im gesamten Code verwendet werden kann, ohne die Methode als Dienstprogrammfunktion zu abstrahieren.
Zum Beispiel mache ich Folgendes, um einen Wert hinzuzufügen:
let o2 = {...o1, age: 31};
Dies ist ziemlich kurz, leicht zu merken und benötigt keine Utility-Funktion.
Gibt es so etwas zum Entfernen eines Wertes? ES6 ist sehr willkommen.
Vielen Dank!
javascript
immutability
amann
quelle
quelle
Antworten:
Aktualisieren:
Sie können eine Eigenschaft mit einer schwierigen Destrukturierungszuweisung aus einem Objekt entfernen :
Wenn der zu entfernende Eigenschaftsname statisch ist, können Sie ihn mit einem einfachen Einzeiler entfernen:
Der einfachste Weg ist einfach:Oder Sie können Ihr Objekt klonen, bevor Sie es mutieren:Alternativ können Sie die
omit
Funktion aus derlodash
Dienstprogrammbibliothek verwenden :Es ist als Teil des lodash- Pakets oder als eigenständiges lodash.omit- Paket erhältlich.
quelle
a2 = a1.filter(el => el.id !== id)
ein Element innerhalb eines Arrays durch eine bestimmte ID weglassen. Gibt es so etwas für ein Objekt nicht?keep_if
const {[prop], ...rest} = obj
funktioniert das nicht ? Warum müssen Sie die extrahierte Eigenschaft einer neuen Variablen zuweisen (omit
in diesem Fall)?Mit ES7-Objektzerstörung:
quelle
a
es in einer Variablen gespeichert istconst x = 'a'
?const { a,b, ...noA } = myObject;
console.log(noA); // => {c: 3 }
Einzeilige Lösung
quelle
Wie in den obigen Kommentaren vorgeschlagen, wenn Sie dies erweitern möchten, um mehr als ein Element aus Ihrem zu entfernen, das
object
ich gerne verwendefilter
. undreduce
z.B
quelle
Um etwas Würze hinzuzufügen, die Leistung bringt. Überprüfen Sie diesen Faden unten
https://github.com/googleapis/google-api-nodejs-client/issues/375
Sie können auch den zerstörerischen Weg verwenden
Und ein praktischeres Beispiel:
Wie Sie sehen, können Sie die
[somePropsVarForDynamicName]: scopeVarName
Syntax für dynamische Namen verwenden. Und Sie können alles in Klammern setzen (neuer Block), so dass der Rest Müll ist, der danach gesammelt wird.Hier ein Test:
exec:
Oder wir können mit einer Funktion wie gehen
für Typoskript
Verwendung:
Auf diese Weise wird ein neues Objekt erstellt. Und die schnelle Eigenschaft des Objekts bleibt erhalten. Welches kann wichtig oder wichtig sein. Wenn auf das Mapping und das Objekt viele Male zugegriffen wird.
Auch das Assoziieren
undefined
kann ein guter Weg sein. Wenn Sie es sich leisten können. Und für die Schlüssel können Sie auch den Wert überprüfen. Um beispielsweise alle aktiven Schlüssel zu erhalten, gehen Sie wie folgt vor:Undefiniert ist jedoch nicht für große Listen geeignet. Oder Entwicklung im Laufe der Zeit mit vielen Requisiten. Da die Speichernutzung weiter zunimmt und niemals bereinigt wird. Es kommt also auf die Nutzung an. Und nur ein neues Objekt zu erstellen, scheint der gute Weg zu sein.
Dann setzt der
Premature optimization is the root of all evil
Wille ein. Sie müssen sich also des Kompromisses bewusst sein. Und was benötigt wird und was nicht.Anmerkung zu _.omit () von lodash
Es wurde aus Version 5 entfernt. Sie können es nicht im Repo finden. Und hier ein Thema, das darüber spricht.
https://github.com/lodash/lodash/issues/2930
v8
Sie können dies überprüfen, was eine gute Lektüre ist: https://v8.dev/blog/fast-properties
quelle
mit lodash cloneDeep und löschen
(Hinweis: Der lodash-Klon kann stattdessen für flache Objekte verwendet werden.)
quelle
Für meinen Code wollte ich eine Kurzversion für den Rückgabewert von map (), aber die Multiline / Mutli-Operations-Lösungen waren "hässlich". Das Hauptmerkmal ist das alte,
void(0)
das sich auflöstundefined
.Die Eigenschaft bleibt im Objekt:
aber das Sende-Framework tötet es für mich (bc stringify):
quelle
Mein Problem mit der akzeptierten Antwort aus einem ESLint-Regelstandard, wenn Sie versuchen zu zerstören:
die 2 neuen Variablen
notNeeded
undalsoNotNeeded
können abhängig von Ihrem Setup eine Warnung oder einen Fehler auslösen, da sie jetzt nicht mehr verwendet werden. Warum also neue Vars erstellen, wenn sie nicht verwendet werden?Ich denke, Sie müssen die
delete
Funktion wirklich nutzen.quelle
no-unused-vars
Regel hatignoreRestSiblings
jetzt tatsächlich die Option , diesen Anwendungsfall abzudecken