是否有一种纯功能性的方式来合并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
值。