Hi,
ich bin gerade am überlegen wie ich eine Funktion schreiben könnte, die es mir erlaubt sub-Objekte zu erstellen, wenn diese nicht existieren.
Das gibts übrigens schon in Lodash.
Für mich richt dieser, mein Code nun ziemlich nach Pfusch und ich wollte fragen, ob man das nicht eleganter lösen kann.
So allgemein nicht. Wenn man den Anwendungsfall kennt vielleicht schon.
Dein Ansatz ist erst mal in Ordnung. Nur wird die letzte Eigenschaft nie gesetzt. Am Ende der Schleife muss root[property] = val; oder ähnliches stehen. Beispiel:
function setPath(object, path, value) {
var properties = path.split('.');
var currentObject = object;
for (let i = 0, l = properties.length - 1; i < l; i++) {
var property = properties[i];
if (typeof currentObject[property] !== 'object') {
var newObject = {};
currentObject[property] = newObject;
currentObject = newObject;
} else {
currentObject = currentObject[property];
}
}
currentObject[property] = value;
return object;
}
Wichtig ist mir auch noch, dass das Ganze in Zombie-Browsern (IE8) läuft.
Das tut dein Beispiel wahrscheinlich. Es erzeugt nur Objekte und setzt Eigenschaften. Das kann sogar IE 8 ;-)
Was ich in meinem Beispielcode auch nicht beachtet habe ist, dass ich "root" auch noch klonen müsste, da ich ansonsten den Wert von "obj" überschreibe.
"obj" wird als Objekt-Referenz übergeben. Änderungen an "obj" verändern auch das Objekt in "root", weil beide Variablen auf dasselbe Objekt verweisen. (Wenn du "root" einen komplett neuen Wert zuweist ändert sich der Wert von "root" allerdings nicht.)
Wenn du das nicht willst und "immutable" arbeiten willst, ja, dann müsstest du ein Deep Clone von obj erstellen. Zumindest alle Objekte die im Pfad liegen müssten geklont werden. Das klingt tatsächlich ein bißchen überkomplex.
Frank