使用解构赋值复制部分对象

Partial object copying using Destructuring Assignment

有一个输入对象需要复制到另一个对象是很常见的。通常您需要复制一些属性,最终得到一个非常相似但属性较少的对象。

此处为解构赋值参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring

假设您有这个输入对象:

// an object with data
let oldObject = {
  a: 'this is a',
  b: 'this is b',
  c: 'this is c',
  d: 'this is d'
}

我是这样做的:

let myNewObject = {
  a: oldObject.a,
  b: oldObject.b,
  c: oldObject.c
}

这是我一直在用的:

// new version
let { a, b, c } = oldObject
let myNewObject = { a, b, c };

我开始使用这个,似乎工作正常:

// newer version
let myNewObject = { a, b, c } = oldObject;

较新版本的问题是我声明了变量 a、b 和 c。在这种情况下没有问题 (),但是如果它们的名称是 inputoutputtempi 或任何其他通用名称怎么办?可能已经在范围内声明的变量。

所以解决方案很棒,但更好的是那些变量以某种方式在该行中创建和销毁并且在其他地方不可用。 myNewObject 当然应该可以访问。

我试过用这样的函数包装它,但一点运气也没有:

let myNewObject = (function() { return { a, b, c } = oldObject })();

let myNewObject = (function() { let temp = { a, b, c } = oldObject; return temp; })();

所以我不确定实现此目标的最佳方法是什么,我快接近了,但我遗漏了一些东西。

The problem with the newer versions is that I'm declaring variables a, b and c. In this case there is no problem

有大问题

let myNewObject = { a, b, c } = oldObject;

赋值给现有的abc变量,这会在松散模式下污染全局作用域或在严格模式下导致错误。而 myNewObject === oldObject。它的 ES5 variation 是:

var myNewObject = (a = oldObject.a, b = oldObject.b, c = oldObject.c, oldObject);

this answer 中所述,您正在寻找的单行代码是具有解构参数的 IIFE:

let myNewObject = (({ a, b, c }) => ({ a, b, c }))(oldObject);