繁体   English   中英

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

[英]Is there a purely functional way to merge objects in 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分配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都没有改变

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM