【问题标题】:Partial object copying using Destructuring Assignment使用解构赋值复制部分对象
【发布时间】:2018-09-03 21:08:18
【问题描述】:

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

解构赋值参考here 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; })();

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

【问题讨论】:

标签: node.js variable-assignment destructuring


【解决方案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);

【讨论】:

  • 我认为这个解决方案有效,但是两次编写变量/属性列表很容易出错,我对此的搜索旨在 1. 更容易编写和 2. 避免重复。关于如何将 let myNewObject = (({ a, b, c }) => ({ a, b, c }))(oldObject); 更改为类似这样的任何提示(当然它不起作用)let params = ['a', 'b', 'c']; let myNewObject = (({ ...params }) => ({ ...params }))(oldObject);
  • 没有办法这样写 DRYer。使用现有的 pick 函数,如 Lodash 或您自己的函数,如此处所示,stackoverflow.com/questions/25553910/…
猜你喜欢
  • 1970-01-01
  • 2017-03-18
  • 2019-01-28
  • 1970-01-01
  • 2018-11-02
  • 2019-10-23
  • 2021-11-07
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多