Ich bin auf der Suche nach einer Funktion identisch mit lodashs _.set
, außer es sollte ein neues Objekt ohne Änderung des Originals zurückgeben. Gibt es irgendwelche Implementierungen davon?Suche nach Funktion identisch mit lodash's [_.set]()
Im Moment bin ich tief-Klonen und dann setzen:
let data = _.cloneDeep(this.state.data);
_.set(data, name, value);
this.setState({data})
Aber ich glaube nicht, es ist notwendig, um eine vollständige tiefe Klon zu tun, würden wir nur einen flachen Klon des tun müssen Objekt auf der tiefsten Ebene, nein?
z.B.
let oldData = { 'a': [{ 'b': { 'c': 3 }, 'd': {'e': 4} }] };
let newDate = withValue(oldData, 'a[0].b.c', 5);
Die vorgeschlagene withValue
Funktion würde einen flachen Klon von a
, a[0]
und a[0].b
ausführen und ändern Sie dann die neue a[0].b.c
bis 5. Wir würden keine Kopie a[0].d
vornehmen müssen.
Nein, das ist nicht ausreichend. Dies würde nicht garantieren, dass eine Mutation des anderen Objekts die neue nicht ändert. Sie müssen also entweder das reine JS-Objekt tiefklonen oder etwas verwenden, das Datenstrukturen für Sie umschließt (wie zB immutablejs). – zerkms
Ab der Reaktion - "Unsetting" wird nicht helfen, da reagiert das übergebene Objekt mit dem bestehenden. – zerkms
@zerkms Was passiert, wenn ich weiß, dass der alte ('this.state.data') niemals mutiert wird, also muss ich mich nicht darum sorgen, dass er den neuen verändert? – mpen