带有变量的Javascript点表示法

时间:2011-12-23 21:05:17

标签: javascript arrays object

不确定怎么说这个。

我正在尝试使用变量来确定钻入对象以返回值的距离。

var target = "level1.level2.var";
var myObject = {
                    level1: {
                        level2: {
                            var: 'value'
                        }  
                    }
               }
var returnVal = myObject.target;

怎么可以这样做?显然这不起作用。是否可能采取其他方式?

我想我可能必须爆炸目标变量然后循环每个级别,但我想我会问是否有更容易的方法可以忽略。

5 个答案:

答案 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()(不赞成,evalevil):

    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