Ich habe ein flaches JS-Objekt:
{a: 1, b: 2, c: 3, ..., z:26}
Ich möchte das Objekt bis auf ein Element klonen:
{a: 1, c: 3, ..., z:26}
Was ist der einfachste Weg, dies zu tun (wenn möglich lieber es6 / 7 zu verwenden)?
Ich habe ein flaches JS-Objekt:
{a: 1, b: 2, c: 3, ..., z:26}
Ich möchte das Objekt bis auf ein Element klonen:
{a: 1, c: 3, ..., z:26}
Was ist der einfachste Weg, dies zu tun (wenn möglich lieber es6 / 7 zu verwenden)?
Antworten:
Wenn Sie Babel verwenden , können Sie die folgende Syntax verwenden, um die Eigenschaft b von x in die Variable b zu kopieren und die restlichen Eigenschaften in die Variable y zu kopieren :
und es wird umgesetzt in:
quelle
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
, die in Version 3.15.0 (3. Februar 2017) hinzugefügt wurde. Siehe: Commit c59a0bab
Umfang gibt.oder wenn Sie akzeptieren, dass Eigentum undefiniert ist:
quelle
Um Ilya Palkins Antwort zu ergänzen: Sie können sogar Schlüssel dynamisch entfernen:
Demo in Babel REPL
Quelle:
quelle
_
der Verwendung einer Variablen, die Sie nicht verwenden möchten ?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Für diejenigen, die ES6 nicht verwenden können, können Sie
lodash
oder verwendenunderscore
.Oder
ramda
.quelle
_.omit(x, 'b')
delete
.Ich benutze diesen ESNext One Liner
Wenn Sie eine Allzweckfunktion benötigen:
quelle
map
Sie können tun:(({b, c, ...others}) => ({...others}))(obj)
Sie können eine einfache Hilfsfunktion dafür schreiben. Lodash hat eine ähnliche Funktion mit dem gleichen Namen: weglassen
Beachten Sie außerdem, dass es schneller als Object.assign ist und löschen Sie dann: http://jsperf.com/omit-key
quelle
Vielleicht so etwas:
Ist das gut genug Oder kann man nicht
c
kopieren?quelle
Verwenden der Objektzerstörung
quelle
_
löst die Verwendung das Problem für ESLint nicht ...Hey, es scheint, als würden Sie auf Referenzprobleme stoßen, wenn Sie versuchen, ein Objekt zu kopieren und dann eine Eigenschaft zu löschen. Irgendwo müssen Sie primitive Variablen zuweisen, damit Javascript einen neuen Wert erzeugt.
Einfacher Trick (kann schrecklich sein), den ich benutzt habe, war dieser
quelle
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Sie müssen es nicht einmal löschen, sondern benötigen nur einen falschen Wert.Hier ist eine Option zum Weglassen dynamischer Schlüssel, von denen ich glaube, dass sie noch nicht erwähnt wurden:
removeMe
wird als voreingenommenremovedKey
und ignoriert.newObj
wird{ 2: 2, 3: 3, 4: 4 }
. Beachten Sie, dass der entfernte Schlüssel nicht vorhanden ist und der Wert nicht nur auf gesetzt wurdeundefined
.quelle
quelle
Lodash weglassen
quelle
Sie können dazu auch den Spread-Operator verwenden
quelle
copy
const copy = { ...source, b: undefined }
läuft genau auf das Gleiche hinaus.Die oben genannten Lösungen mit Strukturierung leiden unter der Tatsache, dass Sie eine verwendete Variable haben, was zu Beschwerden von ESLint führen kann, wenn Sie diese verwenden.
Also hier sind meine Lösungen:
Auf den meisten Plattformen (außer IE, sofern nicht Babel verwendet wird) können Sie außerdem Folgendes tun:
quelle
Wie wäre es damit:
quelle
Wenn Sie mit einer großen Variablen arbeiten, möchten Sie sie nicht kopieren und dann löschen, da dies ineffizient wäre.
Eine einfache for-Schleife mit einer hasOwnProperty-Prüfung sollte funktionieren und ist viel anpassungsfähiger für zukünftige Anforderungen:
quelle
Was ist damit? Ich habe dieses Muster nie gefunden, aber ich habe nur versucht, eine oder mehrere Eigenschaften auszuschließen, ohne ein zusätzliches Objekt erstellen zu müssen. Dies scheint den Job zu erledigen, aber es gibt einige Nebenwirkungen, die ich nicht sehen kann. Sicher ist nicht sehr lesbar.
quelle
Ich habe es so gemacht, als Beispiel von meinem Redux-Reduzierer:
Mit anderen Worten:
quelle
const { [removeMe]: removedKey, ...newObj } = obj;
- siehe meine Antwort auf diese Frage.Ich habe es kürzlich ganz einfach gemacht:
Verwenden Sie einfach den Spread-Operator , um die unerwünschte Eigenschaft zu trennen:
... und object.assign , um nur den ' Rest'-Teil zu übernehmen:
quelle
rest
ist bereits ein neues Objekt - Sie brauchen nicht die letzte Zeile. Dies ist außerdem identisch mit der akzeptierten Lösung.quelle