首页 > 解决方案 > Javascript - 动态嵌套横向

问题描述

我的目标是这样的:

说如果我有参考

a: {
    b: {
        c:{
           d: {
                  //Some properties here. 
           }
        } 
    }
}

然后通过使用类似的字符串"a.b.c.d"(事先不知道),我希望能够横向对象并获取d(或 return null/ throw Error)的值。

我知道我们总是可以得到下面一个深度的值(例如a["b"]等等),然后这绝对可以使用.split()然后使用循环或递归来实现,但我希望有一个更简单的一步方法这样做。

标签: javascriptecmascript-6

解决方案


如果不使用循环,就没有其他方法可以做到这一点是递归。eval()可以这样做,但不推荐。

const getProp = (obj,path) => path.split('.').reduce((ac,a) => (ac || {})[a],obj);

const obj = { a: {
    b: {
        c:{
           d: {
              someprop:"x"
           }
        } 
    }
}
}
console.log(getProp(obj,"a.b.c.d"))

另一种方法可能是使用Proxy(),但我仍然会说reduce()更好。

const obj = { 
    a: {
        b: {
            c:{
               d: {
                  someprop:"x"
               }
            } 
        }
    }
}

const handler = {
  get:function(obj,prop){
    if(prop.includes('.')) return prop.split('.').reduce((ac,a) => (ac || {})[a] ,obj)
    else return obj[prop]
  }
}

let res = new Proxy(obj,handler);

console.log(res['a.b.c.d'])

基于评论a.b.c.d事先不知道”

const obj = { 
    a: {
        b: {
            c:{
               d: {
                  someprop:"x"
               }
            } 
        }
    }
}
const getProp = (obj,depth) => [...Array(depth)].reduce((ac,a) => (Object.values(ac)[0] || {}),obj)

console.log(getProp(obj,4))


推荐阅读