我目前正在使用javascript eval()来检查和创建一个我不知道深度的多维对象。
基本上,我想知道是否有任何方法可以创建这个多深度对象。对象可以与result['one']['two']['three']['four']['five']['six']['seven']
一样深。我知道有些情况下使用eval()非常好,但我也担心性能。我想过将每个深度引用到一个新变量,但我不知道如何在Javascript中做指针
create = function(fields, create_array){
var field;
for (j = 0; j < len; j++){
field = fields.slice(0, j).join('');
if (field){
// is there any way to do this without eval?
eval('if (typeof result' + field + ' == "undefined" || !result' + field + ') result' + field + ' = ' + (create_array?'[]':'{}') + ';');
}
}
}
答案 0 :(得分:2)
怎么样
var deep = { one: { two: { three: { four: { five: { six: { seven: 'peek-a-boo!' }}}}}}};
我看不出“eval()”与此有什么关系;没有理由“初始化”这样的对象。只需创建它们。
如果你想用你所拥有的API编写一个函数(由于我不明白的原因),你可以这样做:
function create(fields, create_array) {
var rv = create_array ? [] : {}, o = rv;
for (var i = 0; i < fields.length; ++i) {
o = o[fields[i]] = create_array ? [] : {};
}
return rv;
}
“create_array”标志似乎没有任何意义,因为你可能总是使用字符串作为键。
答案 1 :(得分:0)
没关系,找到了我的方式。我使用递归函数来确保正确创建对象。
create = function(create_array, res, path){
var field = fields.shift();
if (field){
if (typeof res[field] == "undefined" || !res[field]) res[field] = (create_array?[]:{});
path.push('["' + field + '"]');
create(create_array, res[field], path);
}
}
var result = {}, strpath = [], fields[];
create(true, result, strpath);
eval('result' + strpath.join('') + ' = value;');
将变量“field”作为函数外部的变量,包含对象的级别。在没有result["field"]["name"]["first"] = value
或["field"]
字段存在或定义为对象的情况下执行["name"]
会抛出错误并停止执行,这就是为什么我要预先创建对象变量,作为数组或对象。
我找不到第二个eval()的另一个选项。在不知道深度的情况下,无法提供访问对象的多个属性的方法。