使用解构分配进行部分对象复制

时间:2018-09-03 21:08:19

标签: node.js variable-assignment destructuring

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

此处的销毁分配参考   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。在这种情况下,没有问题(almost),但是如果它们的名称分别是inputoutputtempi或可能已经在作用域中声明的变量。

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

我尝试将其包装在这样的函数中,但一点都不幸运:

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

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

所以我不确定实现这一目标的最佳方法是什么,我已经接近了,但是我缺少了一些东西。

1 个答案:

答案 0 :(得分:1)

  

较新版本的问题是我声明了变量a,b和c。在这种情况下没有问题

有个大问题。

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);