由于缩小而替代 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 注入您的代码。
我想这样创建一个对象:
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 注入您的代码。