动态访问复杂的Javascript对象

时间:2015-09-22 06:10:12

标签: javascript

我有一个javascript对象,如下所示:

var obj = { simpleName: "some name"  name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } }

我还有另一个这样的对象:

var foo = { loc = "name.firstName" }

根据foo.loc值,我必须访问obj对象中的值。 在这种情况下,我需要访问obj.name.firstname。 所以,到目前为止,我尝试过这样的事情:

  var props = foo.loc.split(".");
    for(var prop in props)
    {
       if (obj.hasOwnProperty(prop))
        {
            alert(obj[prop])
        }
    } 

我的问题是,我现在只能访问name对象的obj属性,如何进入该属性,如name.firstName,我知道{{1}会工作,但我如何动态地这样做?比如将其扩展为obj[name][firstName]

3 个答案:

答案 0 :(得分:2)

很少有人遗漏,firstname vs firstName,但如果你修复了这些,那么这很有用:

var obj = { simpleName: "some name",  name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } }
var foo = { loc: "name.firstName" }
var props = foo.loc.split(".");
var output = props.reduce( function(prev,prop) {
  if (prev.hasOwnProperty(prop)) { 
    return prev[prop]
  } else {
   // however you want to handle the error ...
  }
}, obj);
alert(output);

答案 1 :(得分:0)

您可以像这样修复代码:

var props = foo.loc.split(".");
var current = obj;
for(var prop in props)
{
  if (current.hasOwnProperty(prop))
  {
     current = current[prop];
     alert(current )
  }
}

但是一旦你开始使用更复杂的“选择器”,这可能不会非常有用,例如,使用数组("names[2].firstname")。

答案 2 :(得分:0)

这是一个功能:

var obj = { simpleName: "some name",  name: { firstName: "anudeep", lastName : "rentala" }, address: { country: "XZ", state:"DF" } };
var foo = { loc: "name.firstName" };

var checkObj = function(obj, props) {

    var temp = obj;

    for(var i = 0, len = props.length; i < len; i++) {
        if(temp.hasOwnProperty(props[i])) {
            temp = temp[props[i]];
        }
        else return false;
    }
    return temp;
};

console.log(checkObj(obj, foo.loc.split('.')));