迭代访问对象键

时间:2014-02-15 01:30:54

标签: javascript

我有一个类似于下面的对象,虽然嵌套了几个字母:

var foo = {
    a:{
        a:{},
        b:{}
    },
    b:{
        a:{},
        b:{}
    }
}

给定一个任意长度的数组,包含' a' s,例如['b','a'],我想修改由数组字母映射的对象键。所以对于我刚给出的数组,我想修改foo [' b'] [' a']或foo.b.a。

我可以想到获取目标值的简单方法,使用如下内容:

var context = foo
for(letter in array){
 context = context[letter]
}
return context

这个问题是,如果我试图修改上下文的最终值,它就不会修改原始对象,这就是我想要的。理想情况下,如果我有一些创建指针的方法,这很简单,但我不认为javascript有它们。

有没有办法有效地做到这一点?

1 个答案:

答案 0 :(得分:1)

可重复使用的功能可以轻松解析任意深度:

function resolve(path, object) {
    var tob = object;
    path.map(function(a) {
        return (tob = tob[a]) || tob;
    });
    return tob;
}


var foo = {
    a:{
        a:{},
        b:{}
    },
    b:{
        a:{},
        b:{}
    }
};

var path= ['b','a'] ;


// resolve path and add a new property:
resolve(path, foo).c=123;
console.log(foo) /* shows:
{
    "a": {
        "a": {},
        "b": {}
    },
    "b": {
        "a": {
            "c": 123
        },
        "b": {}
    }
} */

因此我们可以看到现在有一​​个属性foo.b.a.c正如预期的那样。