Wenn ich Ihre Frage richtig dies könnte undertand sein, was Sie suchen:
var set_value = function(obj, path, value) {
var limit = path.length;
// You might want to check if limit is 0 here.
for (var i = 0; i < limit-1; i++) {
var key = path[i];
if (!obj.hasOwnProperty(key)) {
// Depending on your case you might throw an error
// here or do something else
obj[key] = {};
}
obj = obj[key];
}
obj[path[limit-1]] = value;
};
Und Nutzung:
var new_obj = {},
array_path = ['foo', 'bar', 'test'],
the_value = 3;
set_value(new_obj, array_path, the_value);
Also alles, was Sie tun müssen, ist array_path
in ein Format zu konvertieren, wie oben . Wenn Sie es als Zeichenfolge erhalten, können einige reguläre Ausdrücke hilfreich sein. Obwohl, wenn Sie die Kontrolle über die Quelle haben, dann stellen Sie einfach sicher, dass es ein JSON-Array ist.
BTW: Verwenden Sie keine hackish (oder keine) evals wie Sie oben haben. Minimierung ist das kleinste Ihrer Probleme. Wenn Sie keine Kontrolle über die Quelle haben (und es ist eine gute Praxis, immer davon auszugehen, dass Sie das nicht tun), haben Sie im Moment ein großes Sicherheitsproblem. Jemand kann schädliches JavaScript mit Leichtigkeit in Ihren Code einfügen.
Sie Konstanten sowie Variablen als Array-Indizes verwenden können, so dass nur die eval entfernen und 'new_obj [var1] [var2] [var3] = the_value verwendet;' sollte ... arbeiten, was die "unbekannt auf runtime" tut Kommentar bedeuten, obwohl? – dlatikay
Wenn Sie die 'array_path' Zeichenfolge zur Laufzeit Gebäude sind, können Sie nur Array-Notation zugreifen als auch das Objekt durch. 'eval()' ist in beiden Fällen redundant. –