【问题标题】:Object destructuring into another object does not work将对象解构为另一个对象不起作用
【发布时间】:2020-05-06 20:18:57
【问题描述】:

今天我不得不合并两个对象,选择对象a 的属性并将它们放入对象b。我不明白为什么第一个语法/语句不起作用,而第二个是。

let user = { a: 1, b: 2 };
let data = { z: 1, c: 3, f: 8, d: 4 };

// Let's say I want user to be { a: 1, b: 2, c: 3}

// method 1 (not works) 
const r1 = {
    ...user,
    ...({c} = data)
};
document.getElementById("r1").innerText = JSON.stringify(r1);

// method 2 (works)
const r2 = {
    ...user,
    ...(({c}) => ({c}))(data)
};
document.getElementById("r2").innerText = JSON.stringify(r2);

你可以试试https://jsfiddle.net/Ljb7ndp4/6/上的代码

【问题讨论】:

  • 好吧 {c} = data 正在创建一个变量 c 而不是对象 console.log(c) 会显示 3
  • 是的,您的全局范围现在包含一个变量 c,其中包含 data.c 的内容。表达式 ({c} = data) 返回原始对象,这就是为什么 r1 包含两个对象的合并内容。
  • 在第二种情况下,您正在调用匿名函数,将data 传递给参数,然后您将解构提取c 的参数,该函数最终返回一个带有c 的对象跨度>
  • @epascarello 你说得对,我还没有考虑过,谢谢

标签: javascript ecmascript-6 destructuring


【解决方案1】:

在第二种方法中,您将创建一个 IIFE(立即调用函数表达式)。

来自MDN docs,“IIFE(立即调用函数表达式)是一个 JavaScript 函数,一旦定义就立即运行”。方法 2 上的 IIFE 返回一个像 {c: <value>} 这样的对象。由于对象支持扩展运算符,因此您可以在对象定义中使用它。

要在您的代码中将其可视化,您可以将 IIFE 的结果分配给一个变量并在控制台上打印结果。

const val = (({c}) => ({c}))(data)
console.log(val) // { c: 3 }

在这种情况下,箭头函数的语法使得可视化发生的事情有点困难,但是代码:

(({c}) => ({c}))(data);

在我看来,这是一个简短的版本,可读性更好。

(function(arg) {
  return { c: arg.c }
})(data);

因此,我们可以将其转换为箭头函数以逐步了解所有转换。

最初我们可以将函数转换为使用箭头函数语法:

((arg) => {
  return { c: arg: c }
})(data)

然后我们可以从收到的参数中解构c

(({c}) => {
  return { c: c }
})(data)

由于创建的箭头函数不需要块,我们可以简化它:

// The parenthesis are added because the syntax () => {} is not valid.
(({c}) => ({ c: c }))(data)

最后,我们可以使用短对象语法使其与原始语法完全相同。

(({c}) => ({ c }))(data)

因此,此函数生成一个{ c: <value> } 对象,因此您可以使用扩展运算符将其合并到您正在构建的对象中。

【讨论】:

  • 我知道箭头函数是做什么的,我不明白的是为什么第一种方法(对象内部的简单解构)不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2021-12-24
  • 2021-08-14
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多