由于缩小,eval()函数的替代方案

时间:2016-06-14 09:35:30

标签: 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变量。我无法找到另一种方法来做我想要的事情,因为在运行时我不知道array_path结构。我有什么想法可以避免使用eval()函数吗?

1 个答案:

答案 0 :(得分:0)

如果我正确地提出你的问题,这可能就是你要找的东西:

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注入您的代码中。