不确定怎么说这个。
我正在尝试使用变量来确定钻入对象以返回值的距离。
var target = "level1.level2.var";
var myObject = {
level1: {
level2: {
var: 'value'
}
}
}
var returnVal = myObject.target;
怎么可以这样做?显然这不起作用。是否可能采取其他方式?
我想我可能必须爆炸目标变量然后循环每个级别,但我想我会问是否有更容易的方法可以忽略。
答案 0 :(得分:9)
您可以使用此功能:
function get_property_from_target(obj, target){
var arr = target.split('.');
for(var i = 0; i < arr.length; i++){
if(obj)
obj = obj[arr[i]];
}
return obj;
}
然后称之为:
get_property_from_target(myObject, target);
我也将这个功能重命名为更好的东西。
另外请不要命名对象属性var
,因为这是Javascript中的一个关键字,它可能会让人感到困惑,我不确定它是否总会以您期望的方式工作,或者它是否会导致某些浏览器中的错误。
答案 1 :(得分:4)
更容易?当然,请使用eval
:
var obj = eval('myObject.' + target);
但是,这并不是一个真正的答案。你不应该在良好的代码中使用eval
。然而,据我所知,唯一的另一种方法是按照你的描述进行循环:
var items = target.split('.');
var obj = myObject;
var i;
for(i = 0; i < items.length; i++) {
obj = obj[items[i]];
}
或者,使用正则表达式hack:
var obj = myObject;
target.replace(/[^\.]+/g, function(m) {
obj = obj[m];
});
无论如何,您现在可以使用obj
。
答案 2 :(得分:2)
我可以看到两种方法:
使用eval()
(不赞成,eval
为evil
):
var returnVal = eval('myObject.' + target);
使用循环:
var split = target.split('.');
var newTarget = myObject;
for (var i = 0; i < split.length; i++) {
newTarget = newTarget[split[i]];
}
答案 3 :(得分:1)
除了编写代码以在.
上拆分目标之外,没有办法,然后对于每个令牌,只要“路径”有效,就可以向下钻取对象。
答案 4 :(得分:1)
我会做什么(可能不是最好的,但它会起作用),就是你所建议的。爆炸变量,然后转到该级别。
var target = "level1.level2.var";
target = target.split('.');
var returnVal = myObject;
for(var i=0,len=target.length; i<len; i++){
returnVal = returnVal[target[i]];
}
console.log(returnVal); // value