Javascript-动态嵌套横向

时间:2019-05-02 06:08:51

标签: javascript ecmascript-6

我的目标是:

如果我有参考文献

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

然后通过使用类似"a.b.c.d"的字符串(事先未知),我希望能够横切对象并获得d的值(或返回null /抛出Error)。

我知道我们总是可以获取下面一个深度的值(例如a["b"],依此类推),然后可以肯定地使用.split()然后使用循环或递归来实现,但我希望有一个更简单的一步方法。

3 个答案:

答案 0 :(得分:1)

没有其他方法可以做到不使用循环就是递归。 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))

答案 1 :(得分:0)

是的,有一个简单的解决方案,将字符串放入eval并将eval放入try / catch

const a = {b:{c:{d:"test"}}};
try{
  console.log(eval("a.b.c.d")); // test
}catch(e){}

答案 2 :(得分:0)

正如您所提到的,密钥是事先未知的,因此可以使用递归或循环:

  

然后使用“ a.b.c.d”之类的字符串(事先未知),   我希望能够横切对象并获得d的值(或   返回null /抛出错误)。

const object = { 
    a: {
        b: {
            c:{
               d: {
                   foo : "bar"
               }
            } 
        }
    }
};

function getNestedData(obj){
 if(!obj){
  return null;
 }
 if(Object.values(obj).filter(val => typeof val !== "object").length){
  return (Object.values(obj)[0] || {});
 }
  return getNestedData(Object.values(obj)[0] || {});
}
console.log(getNestedData(object));