2016-06-14 38 views
2

我想創建一個對象是這樣的:替代eval()函數由於微小

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

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

不幸的是縮小後的「new_obj」參數將不new_obj變量相匹配。我找不到另一種方法去做我想做的事情,因爲在運行時我不知道array_path結構。任何想法我可以如何避免eval()函數?

+0

你可以使用常量以及變量作爲數組索引,所以只需刪除eval並使用'new_obj [var1] [var2] [var3] = the_value;'應該工作......什麼是「運行時未知」意思是說,但? – dlatikay

+1

如果您在運行時構建'array_path'字符串,則可以通過數組表示法訪問該對象。無論哪種情況,'eval()'都是多餘的。 –

回答

0

如果我undertand你的問題正確,這可能是你在找什麼:

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; 
}; 

與用法:

var new_obj = {}, 
    array_path = ['foo', 'bar', 'test'], 
    the_value = 3; 

set_value(new_obj, array_path, the_value); 

因此,所有你需要做的就是爲上述轉換array_path的格式。如果你以字符串的形式接收它,那麼一些正則表達式可能會有幫助。儘管如果你有對源代碼的控制權,那麼只要確保它是一個JSON數組。

順便說一句:不要像上面那樣使用hackish(或任何)evals。縮小是你的問題中最少的。如果您無法控制源代碼(並且始終認爲您不這麼做是個好習慣),那麼您目前遇到了巨大的安全問題。有人可以輕鬆地將有害的JavaScript注入代碼中。