由于缩小而替代 eval() 函数

Alternative to eval() function due to minification

我想这样创建一个对象:

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() 函数吗?

如果我正确理解你的问题,这可能就是你要找的:

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 数组。

顺便说一句:不要像上面那样使用骇人听闻的(或任何)评估。缩小是你最少的问题。如果您无法控制源(并且始终假设您不这样做是一个好习惯),那么您目前面临着巨大的安全问题。有人可以轻松地将有害 JavaScript 注入您的代码。