假设我有一个具有某些属性的对象:
const obj = {
key1: 1
key2: 2
}
我有一个函数someFunc
,它将一个对象作为参数。我想通过一些额外的参数传递obj
,比如
someFunc({
key1: 1
key2: 2
otherKey: 3
})
问题是我不想真正改变obj
的状态。在someFunc
被召唤之后,它不应该包含otherKey
作为财产。
这使得Object.assign
无从谈起:
let ident = someObj => someObj;
ident(Object.assign(obj, {otherKey: 3}))
console.log(someObj); // -> {key1: 1, key2: 2, otherKey: 3}
创建一个新变量并为其分配otherKey = 3
也是一样的。
我知道我可以使用某种深度复制 - 但这似乎是处理一个相当简单的问题的一种不必要的复杂方式。
这样做的最优雅方式是一个纯函数,它接受一些对象obj1, obj2
,返回与Object.assign(obj1, obj2)
相同的输出,但不改变它们。是否有一些明显的方法在JS中执行此操作,我还没有看到,或者我是否必须使用其他库?
只需将参数反转为Object.assign
- 它会将obj
中的属性添加到新对象:
ident(Object.assign({otherKey: 3}, obj))
警告
但是你必须小心obj
中已存在的属性,因为它们会覆盖新数组中的属性。
你正在处理不变性。另一种方法是使用ES6的扩展运算符:
const obj1 = {
key1: 1,
key2: 2,
}
const obj2 = {
key1: 1,
key2: 12,
otherKey: 3
};
const merged = { ...obj1, ...obj2 };
console.log('merged: ', merged);
console.log('obj1: ', obj1);
console.log('obj2: ', obj2);
你会看到obj1和obj2都没有改变