从嵌套属性数组中获取对象嵌套值

时间:2013-10-04 10:48:08

标签: javascript arrays node.js javascript-objects

我有一种情况需要将两个对象压缩在一起,同时保留两个值。我可以迭代这两个对象并构建一个包含所有键的数组。

    var traverse = function (obj, chain) {

        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {

                var tempChain = [].concat(chain || []);
                tempChain.push(prop);

                if (typeof obj[prop] === 'object') {
                    traverse(obj[prop], tempChain);
                }
                console.log(tempChain);
            }
        }
    };

传递以下内容:

    traverse({
        'a': {
            'b': 'hello world',
            'b1': 'hello world 1',
            'c': {
                'd': 'dello'
            }
        }
    })

会回复我:

[a]
[a,b]
[a,b1]
[a,c]
[a, c, d]

所以我现在在对象中有一个嵌套属性数组。我怎样才能访问obj [[a,c,d]]?我知道我可以通过eval解决问题,但我不相信内容。

eval('window.' + ['a','c','d'].join('.')); 

如果我可以循环遍历该数组并检查它们是否同时存在,那么构建一个组合“zipped”值的新对象。

1 个答案:

答案 0 :(得分:1)

也许是这样的?

function getValueAt(obj, keyPathArray) {
    var emptyObj = {};

    return keyPathArray.reduce(function (o, key) {
        return (o || emptyObj)[key];
    }, obj);
}

然后你就可以使用它:

var o = { a: { c: { d: 1 } } };

getValueAt(o, ['a', 'c', 'd']); //1

然而,对于不存在的属性来说效率不高,因为它不会短路。 这是另一种不使用reduce的方法:

function getValueAt(o, keyPathArray) {
    var i = 0, 
        len = keyPathArray.length;

    while (o != null && i < len) o = o[keyPathArray[i++]];

    return o;    
}
相关问题