Tiefe Kopie in ES6 über die Verbreitung syntax
Ich versuche zum erstellen einer tiefen Kopie map-Methode für meine Redux-Projekt, die Arbeit mit Objekten statt mit arrays. Ich habe gelesen, dass in Redux jeder Staat sollte sich nichts ändern, die bisherigen Mitgliedstaaten.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Funktioniert es:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Jedoch nicht Tiefe Kopie inneren Elemente, so brauche ich, um es zu optimieren, um:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Dies ist weniger elegant, wie es erforderlich zu wissen, welche Objekte übergeben werden.
Gibt es eine Möglichkeit in ES6 zu verwenden, die Ausbreitung syntax, um Tiefe Kopie eines Objekts?
- Siehe stackoverflow.com/questions/27936772/....
- Dies ist ein XY-problem. Sie sollten nicht zu viel auf der tiefen Eigenschaften in redux. stattdessen sollten Sie erstellen Sie einfach ein anderes Getriebe arbeitet auf der Kind Scheibe des Staates, die Form und verwenden Sie dann
combineReducers
zu Komponieren, die zwei (oder mehr) zusammen. Wenn Sie verwenden idiomatische redux-Techniken, die Ihr problem von deep-Objekte Klonen geht Weg.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine solche Funktionalität eingebaut, um ES6. Ich denke, Sie haben ein paar Optionen, je nachdem, was Sie tun möchten.
Wenn Sie wirklich wollen, um Tiefe Kopie:
cloneDeep
Methode.Alternative Lösung Zu Ihrem Spezifischen Problem (Keine Tiefe Kopie)
Allerdings denke ich, dass, wenn Sie bereit sind, ändern ein paar Dinge, Sie können sparen Sie sich einige Arbeit. Ich gehe davon aus Steuern Sie sämtliche call-sites an Ihre Funktion.
Angeben, dass alle Rückrufe übergeben
mapCopy
muss wieder neue Objekte anstelle von mutierend das vorhandene Objekt. Zum Beispiel:Das macht die Verwendung von
- Objekt.zuweisen
ein neues Objekt zu erstellen, legt Eigenschaften vone
auf das neue Objekt, setzt dann einen neuen Titel auf das neue Objekt. Dies bedeutet, dass Sie nie mutieren vorhandenen Objekte und nur neue erstellen, wenn nötig.mapCopy
können, werden wirklich einfache heute:Im wesentlichen
mapCopy
ist Vertrauen in seine Anrufer, das richtige zu tun. Das ist, warum ich sagte, dies übernimmt die Steuerung aller call-sites.Stattdessen verwenden Sie diese für Tiefe Kopie
JS:
Von MDN
Persönlich, ich schlage vor, mit Lodash ist cloneDeep - Funktion für multi-level-Objekt/array Klonen.
Hier ist ein funktionierendes Beispiel:
JS:
HTML:
Run code snippet
und es sollte ordnungsgemäß laufen.Ich benutze oft diese: