在ES6速记表示法中获得深层属性的最佳方法

时间:2017-10-08 10:04:56

标签: javascript ecmascript-6

我遇到了一个问题,我在下面有一个对象

a = {
   b: {
    c: 10
   }
};

现在这是一个动态对象,在运行时可以是空的,比如这个a = {},我试图用ES6这样的简写符号来读c,比如const {b:{c}} = a;。但每次对象为空时都会收到错误。是否有一种方法我仍然可以将这种表示法用于空对象,例如在这种情况下获取未定义的c。

我知道我可以做一些像(a.b?a.b.c:undefined)这样的事情,但我只想知道这种做法。

4 个答案:

答案 0 :(得分:3)

您可以为内部对象执行= {}

const a = {
   b: {
    c: 10
   }
};

const f = ({b: {c} = {}}) => console.log(c)

f(a)
f({})

在这种情况下,如果对象为空,c将变为未定义

答案 1 :(得分:2)

你可以做到

let a = {
   b: {
    c: 10
   }
};

let result = a && a.b && a.b.c;

console.log(result);

如果属性存在,它将返回属性,否则返回undefined

答案 2 :(得分:0)

你可能想要一种通用的方法,对于浅层结构来说并不是很简洁,但可以节省你编译静态的条件序列。

function dive (obj, pz) {
  return pz.reduce((acc, p) => {
    return obj && p in acc ? acc[p] : undefined;
  }, obj);
}

您可以将其与arbirary深度

一起使用
console.log(dive({a:{b:{c:[10,11,12]}}}, ['a', 'b', 'c', 1]))

c.f。 this demo

答案 3 :(得分:0)

lodash一个镜头:

lodash.get(a, 'b.c', FALLBACK_DEFAULT_VALUE);