【问题标题】:How to destructure nested object with null value using default value如何使用默认值解构具有空值的嵌套对象
【发布时间】:2019-09-30 05:01:05
【问题描述】:

尝试解构可能为空的嵌套对象时,不使用默认值。

我已经通过在多个阶段进行解构来实现这一点,但如果可能的话,我宁愿在一个阶段中完成。

const obj = { a: null };
const { a: { b, c } = {} } = obj;

这会导致错误:
Cannot destructure property 'b' of 'undefined' or 'null'

我希望 b 和 c 是 undefined

【问题讨论】:

  • the default value is not being used什么默认值?
  • 如何解构不存在的东西?您必须将对象设置为初始化const obj = { a: { b, c} }
  • @AZ_ 默认值在第二行代码中用= {}表示。因此,如果aundefined,则会改为解构一个空对象。
  • @Michael 这就是= {} 的目的。因此,如果aundefined,则将使用一个空对象进行解构。
  • 好的,default 值仅在 property 不存在时分配 (undefined)。

标签: javascript object ecmascript-6


【解决方案1】:

对于要使用的default value,您要解构的值必须是undefined

const obj = { a: undefined };
const { a: { b, c } = {} } = obj;

console.log(b, c)

【讨论】:

  • 但是如果 a 是 null 而不是 undefined,这不起作用。
【解决方案2】:

transpiling 之后的代码如下所示:

var obj = { a: null };
var _obj$a = obj.a;
_obj$a = _obj$a === void 0 ? {} : _obj$a;
var b = _obj$a.b,
    c = _obj$a.c;

这里的_obj$a 是引用obj.a 的临时变量。如果提供了默认值,它只会根据void 0(或undefined)而不是null检查这个值

可以仍然使用解构来做到这一点。但是,传统的nullundefined 检查更容易理解。

let obj = { a: null },
  a = obj.a,
  b, c;

if (typeof a !== "undefined" && a !== null) {
  b = obj.a.b;
  c = obj.a.b;
}

【讨论】:

    【解决方案3】:

    您可以将null 更改为临时对象中的空对象。在对象条目上使用map()null 更改为空对象{},然后使用Object.fromEntries 将其转换为对象

    const obj = { a: null };
    const { a: { b, c } = {} } = Object.fromEntries(Object.entries(obj).map(x => x[1] === null ? {} : x));
    
    console.log(b,c)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-09
      • 2020-12-07
      • 1970-01-01
      • 2021-02-10
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多