Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 由于缩小,可替代eval()函数_Javascript_Jquery_Minify - Fatal编程技术网

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