2016-06-14 7 views
2

würde Ich mag ein Objekt auf diese Weise erstellen:Alternative zu Funktion eval() aufgrund minification

var new_obj = {}, 
    array_path = '', 
    the_value = 3; 

array_path = '[\''fruits'\'][\''banana'\'][\''value'\']'; // unknown on runtime 
eval('new_obj' + array_path + ' = ' + the_value + ';'); 

Leider nach minification der 'new_obj' Parameter werden die new_obj Variable nicht überein. Ich kann keinen anderen Weg finden, um zu tun, was ich will, weil die Array_path-Struktur mir zur Laufzeit unbekannt ist. Irgendwelche Ideen, wie ich die eval() Funktion vermeiden kann?

+0

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

+1

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. –

Antwort

0

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.