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

Posted

技术标签:

【中文标题】从嵌套属性数组中获取对象嵌套值【英文标题】:Getting an Objects nested value from an array of nested properties 【发布时间】:2013-10-11 08:13:30 【问题描述】:

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

    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('.')); 

如果我可以遍历该数组并检查属性是否存在于它们中,则构建组合“压缩”值的新对象。

【问题讨论】:

window !== obj,这无论如何都行不通。但是,是的,您可以使用一个简单的循环。 检查any of these duplicates - 只需省略.split("."),因为您已经有一个数组 我认为这是某种XY problem。你的 zip 到底应该做什么,为什么你需要财产链? 【参考方案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;    

【讨论】:

为什么不简单地while (o!=null &amp;&amp; i&lt;l) o = o[keyPathArray[i++]];?目前,当i 超过长度时,您将始终返回undefined,而当o 在某处变为null 时,它将失败。 我已经尝试使用您的两种解决方案,但是函数返回值,我希望对象指向该值。为了给出更好的解释,这里有一些使用 eval 的工作代码。 jsbin.com/EHeFayu/7 @Bergi,是的,不知何故,我还没有确定最后一个值可能是一个对象,而null 的类型是“对象”。愚蠢的错误。固定。 @dtsn,我现在无法访问 jsbin,但是我相信您可以忽略数组中的最后一个元素,它将返回包含该属性的对象。 var keyPath = ['a', 'b', 'c']; keyPath = keyPath.slice(0, keyPath.length - 1); getValueAt(o, keyPath); 显然你必须持有对根对象的引用。

以上是关于从嵌套属性数组中获取对象嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

ES6方式 - 按键从嵌套数组中获取唯一值

如何从具有嵌套对象数组的对象数组中获取所有特定值?

从嵌套的 json 值对象中获取数组

无法从 json-server 获取嵌套的对象数组

MongoDB在对象数组中获取嵌套在对象数组中的单个对象

如何从嵌套对象中获取具有值的所有键