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

是否有一种纯功能性的方式来合并JavaScript中的对象?,javascript,Javascript,假设我有一个具有某些属性的对象: const obj = { key1: 1 key2: 2 } 我有一个函数someFunc,它接受一个对象作为参数。我想传递带有一些附加参数的obj,如 someFunc({ key1: 1 key2: 2 otherKey: 3 }) 问题是我不想实际更改obj的状态。调用someFunc后,它不应包含otherKey作为属性 这使得对象无法分配: let ident = someObj => someObj; ident(O

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

const obj = {
  key1: 1
  key2: 2
}
我有一个函数
someFunc
,它接受一个对象作为参数。我想传递带有一些附加参数的
obj
,如

someFunc({
  key1: 1
  key2: 2
  otherKey: 3
})
问题是我不想实际更改
obj
的状态。调用
someFunc
后,它不应包含
otherKey
作为属性

这使得
对象无法分配

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

只需将参数反转到
对象。分配
-它会将
obj
中的属性添加到新对象:

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

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

您正在处理不变性问题。另一种实现方法是使用ES6的扩展运算符:

const obj1={
关键1:1,
关键2:2,
}
常数obj2={
关键1:1,
键2:12,
其他关键字:3
};
const merged={…obj1,…obj2};
log('merged:',merged);
console.log('obj1:',obj1);

log('obj2:',obj2)
someFunc(Object.assign({},obj,{otherKey:3}))
JS对象不能在没有变异的情况下动态填充。@Bergi有什么潜在的原因吗?@JohnHartman可能是因为JS中的OOP是完全必需的?它只是没有将不可变对象作为原语来设计。相关:这通常是像
ident(Object.assign({},obj,{otherKey:3}))
这样做的,因此您知道发送的对象将始终具有
otherKey
3
,而不管
obj
是否已经具有
otherKey
值。