Javascript 由于缩小,可替代eval()函数
我希望通过以下方式创建对象:Javascript 由于缩小,可替代eval()函数,javascript,jquery,minify,Javascript,Jquery,Minify,我希望通过以下方式创建对象: 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变量不匹配。我想不出
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变量不匹配。我想不出另一种方法来做我想做的事情,因为我在运行时不知道数组的路径结构。你知道如何避免使用eval()函数吗?如果我正确理解了你的问题,这可能就是你想要的:
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;
};
因此,您所要做的就是将array\u path
转换为上述格式。如果您将其作为字符串接收,那么一些正则表达式可能会有所帮助。虽然如果您可以控制源代码,那么只需确保它是一个JSON数组
顺便说一句:不要像上面那样使用黑客(或任何)评估。缩小是你最小的问题。如果您对源代码没有控制权(并且总是假设您没有控制权是一个好的实践),那么您目前就有一个巨大的安全问题。有人可以轻松地将有害的JavaScript注入到您的代码中。您可以使用常量和变量作为数组索引,因此只需删除eval并使用
new_obj[var1][var2][var3]=值代码>应该可以工作。。。不过,“运行时未知”注释是什么意思?如果您在运行时构建array\u path
字符串,那么您也可以通过数组表示法访问对象<代码>eval()
在这两种情况下都是多余的。
var new_obj = {},
array_path = ['foo', 'bar', 'test'],
the_value = 3;
set_value(new_obj, array_path, the_value);