空检查对象中的解构变量

Kir*_*ash 2 javascript ecmascript-6

我有下面显示的代码,用于end_timethis.props.auction对象中解构属性

const {auction: {auction: {end_time}}} = this.props;
Run Code Online (Sandbox Code Playgroud)

但是这里的问题是,如果拍卖是一个空对象,则上述常量将是未定义的。为了解决这个问题,我已将代码更改为

if(Object.keys(this.props.auction).length) {
   var {auction: {auction: {end_time}}} = this.props;
} else {
   var {end_time} = "";
}
Run Code Online (Sandbox Code Playgroud)

上述解决方案有效但很丑陋,我相信肯定有更好的方法来做到这一点。

按照这篇文章的答案和

到目前为止,我的尝试是:

const {auction: {auction: {end_time = null}}} = this.props || {};
Run Code Online (Sandbox Code Playgroud)

我认为上面end_time的默认设置为,null但我猜因为auction没有定义它会抛出一个错误。

请提出一个更好的方法来声明end_time一个空的常量auction

Ry-*_*Ry- 5

你并不需要使用解构你每次可以使用它。

const auction = this.props.auction.auction;
const end_time = auction === undefined ? null : auction.end_time;
Run Code Online (Sandbox Code Playgroud)

  • @PatrickRoberts 这个问题现在已经开放,所以如果您愿意,您可以将其添加为单独的答案。 (2认同)

Pat*_*rts 5

您可能会使用具有以下默认值的解构:

const { auction: { auction: { end_time = null } = {} } = {} } = this.props || {};
Run Code Online (Sandbox Code Playgroud)

但是因为上面的语法很麻烦而且不自然,所以在这种情况下我最终屈服于Ry 的建议

你并不需要使用解构你每次可以使用它。


我意识到这被标记为,但这个问题提供了一个很好的例子,其中使用可选链运算符空合并运算符似乎是最自然的解决方案,至少当它们正式合并到 ECMAScript 2020 规范时:

const end_time = this.props?.auction?.auction?.end_time ?? null;
Run Code Online (Sandbox Code Playgroud)