是否有一种纯粹的功能方式来合并JavaScript中的对象?

时间:2017-12-21 05:35:37

标签: javascript

假设我有一个具有某些属性的对象:

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中有一些我没见过的明显的方法,或者我是否必须使用其他库?

2 个答案:

答案 0 :(得分:6)

只需将参数反转为Object.assign - 它会将obj中的属性添加到新对象中:

ident(Object.assign({otherKey: 3}, obj))

<强>注意

但是您必须注意obj中已存在的属性,因为它们将覆盖新数组中的属性。

答案 1 :(得分:1)

您正在处理 immutability 。另一种实现方法是使用ES6的 spread 运算符:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

你会发现obj1和obj2都没有被改变