拥有一个需要复制到另一个对象的输入对象是很常见的。通常,您需要复制一些属性,最终会得到一个非常相似的对象,但属性较少。
假设您有此输入对象:
// 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),但如果他们的名字是input
,output
,temp
,i
或任何其他可能已在范围内声明的变量的通用名称会怎么样。
所以解决方案很棒,但更好的是这些变量以某种方式在该行中创建和销毁而在其他地方不可用。当然,myNewObject
应该是可访问的。
我尝试将它包装在这样的函数中,但根本没有运气:
let myNewObject = (function() { return { a, b, c } = oldObject })();
let myNewObject = (function() { let temp = { a, b, c } = oldObject; return temp; })();
所以我不确定实现这一目标的最佳方式是什么,我已经接近了,但我错过了一些东西。
新版本的问题是我正在声明变量a,b和c。在这种情况下没有问题
有一个大问题。
let myNewObject = { a, b, c } = oldObject;
分配给现有的a
,b
和c
变量,这将在松散模式下污染全局范围或在严格模式下导致错误。而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);