Javascript 在ES6速记符号中获取深层属性的最佳方法

Javascript 在ES6速记符号中获取深层属性的最佳方法,javascript,ecmascript-6,Javascript,Ecmascript 6,我遇到了一个问题,在这里我有一个对象,如下所示 a = { b: { c: 10 } }; 现在这是一个动态对象,在运行时可以是空的,就像这个a={},我试图用ES6速记符号来读取c,比如const{b:{c}}=a;。但每次对象为空时都会出现错误。有没有一种方法我仍然可以对空对象使用这种表示法,比如在这种情况下c的get undefined 我知道我可以做一些类似(a.b?a.b.c:未定义)的事情,但我只是想知道如何做。你可以对内部对象执行={}: const a={

我遇到了一个问题,在这里我有一个对象,如下所示

a = {
   b: {
    c: 10
   }
};
现在这是一个动态对象,在运行时可以是空的,就像这个a={},我试图用ES6速记符号来读取c,比如const{b:{c}}=a;。但每次对象为空时都会出现错误。有没有一种方法我仍然可以对空对象使用这种表示法,比如在这种情况下c的get undefined


我知道我可以做一些类似(a.b?a.b.c:未定义)的事情,但我只是想知道如何做。

你可以对内部对象执行
={}

const a={
b:{
c:10
}
};
常量f=({b:{c}={})=>console.log(c)
f(a)

f({})
您可以对内部对象执行
={}

const a={
b:{
c:10
}
};
常量f=({b:{c}={})=>console.log(c)
f(a)
f({})
你可以做什么

a={
b:{
c:10
}
};
设结果=a&&a.b&&a.b.c;
控制台日志(结果)您可以执行以下操作

a={
b:{
c:10
}
};
设结果=a&&a.b&&a.b.c;

控制台日志(结果)您可能需要一种通用方法,这种方法对于浅层结构来说并不十分简洁,但可以节省编译静态条件序列的时间

function dive (obj, pz) {
  return pz.reduce((acc, p) => {
    return obj && p in acc ? acc[p] : undefined;
  }, obj);
}
你可以使用任意深度

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

c、 f.

您可能需要一种通用方法,这种方法对于浅层结构来说并不十分简洁,但可以节省编译静态条件序列的时间

function dive (obj, pz) {
  return pz.reduce((acc, p) => {
    return obj && p in acc ? acc[p] : undefined;
  }, obj);
}
你可以使用任意深度

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

c、 f.

给洛达斯一枪:

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

给洛达斯一个镜头:

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


特别是看这个答案:特别是看这个答案:如果
a
被保证是一个对象,你不需要检查它,因为它将永远是一个对象true@ferrybig不不不。OP在他的问题中说,不能保证
a
不是
null
/
undefined
“现在这是一个动态对象,在运行时可以为空,比如a={}”“@marvel308是的,这肯定会给出结果&谢谢你的回答。但我的问题是如何以ES6的方式执行它?如果
a
被保证是一个对象,那么您不需要检查它,因为它将始终是一个对象true@ferrybig不不不。OP在他的问题中说,不能保证
a
不是
null
/
undefined
“现在这是一个动态对象,在运行时可以为空,比如a={}”“@marvel308是的,这肯定会给出结果&谢谢你的回答。但我的问题是,如何用ES6的方式来做呢?这样,即使我把值赋值给c:10,我也会得到未定义的c。是吗?@RanjeetGautam运行我的代码。定义
c
时,返回值;否则未定义。是的,抱歉,我道歉,它确实运行,但这不是像在方法参数中设置默认属性一样吗?实际上,我想知道一种简单的速记方法,即使在b未定义的情况下也能捕获c。@RanjeetGautam在这种情况下,答案是:这样,即使我将值分配给c:10,我也会始终将c作为未定义的。是吗?@RanjeetGautam运行我的代码。定义
c
时,返回值;否则未定义。是的,抱歉,我道歉,它确实运行,但这不是像在方法参数中设置默认属性一样吗?事实上,我想知道一种简单的速记方法来捕获c,即使b是未定义的。@RanjeetGautam在本例中,答案是:我使用的是ES6方式。感谢您的回答:)您可以选择香草ES6或安全简洁的Lodash。我用过这个,我一直在寻找ES6的方式。感谢您的回答:)您可以选择香草ES6或安全简洁的Lodash。