Javascript 合并两个JSON对象数组的JSON属性(使用ramda)
假设我有两个数组,如下所示:Javascript 合并两个JSON对象数组的JSON属性(使用ramda),javascript,node.js,ramda.js,Javascript,Node.js,Ramda.js,假设我有两个数组,如下所示: let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}] let a2 = [{id:1, age:42}, {id:2, age:13}] 我想合并这两个数组,以便将JSON属性合并到一个数组中;i、 e.这就是我想要的结局: [{ id: 1, name: 'jon', age: 42 },{ id: 2, name: 'adam', age: 13 }] 使用Ramda我可以做下面的事情,这让我更接近我想要的,但
let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{id:1, age:42}, {id:2, age:13}]
我想合并这两个数组,以便将JSON属性合并到一个数组中;i、 e.这就是我想要的结局:
[{ id: 1, name: 'jon', age: 42 },{ id: 2, name: 'adam', age: 13 }]
使用Ramda
我可以做下面的事情,这让我更接近我想要的,但令人恼火的是,它不在一个数组中——它都是JSON
R.mergeDeepLeft(a1, a2)
{ '0': { id: 1, name: 'yasin', age: 42 },
'1': { id: 2, name: 'adam', age: 13 } }
也许不是最优雅、最可扩展的解决方案,但我会使用一些映射和扩展运算符:
let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{id:1, age:42}, {id:2, age:13}]
let a3 = a1.map(item => {
return {...item, ...a2.find(item2 => item2.id === item.id)}
})
这里有一把可以用的小提琴试试这个:
let a1=[{id:1,名称:'jon'},{id:2,名称:'adam'}]
设a2=[{age:13,id:2},{id:1,age:42}]
常数fn=R.管道(
R.map(R.indexBy(R.prop('id')),
R.reduce(R.mergeWith(R.mergeDeepLeft),{}),
R.价值观
)
设newArray1=fn([a1,a2]);
设newArray2=fn([a2,a1]);
console.log(newArray1);
console.log(newArray2)代码>
您可以使用R.values
转换为数组,如下所示:
let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{id:1, age:42}, {id:2, age:13}]
R.values(R.mergeWith(R.mergeLeft, a1, a2));
如果有无序数组,可以执行以下操作:
let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{id:2, age:13}, {id:1, age:42}]
R.values(R.mergeWith(
R.mergeLeft,
R.indexBy(R.prop('id'), a1),
R.indexBy(R.prop('id'), a2)
));
会产生这个
{"0": {"age": 42, "id": 1, "name": "jon"}, "1": {"age": 13, "id": 2, "name": "adam"}}
它不是精确的输出,但您可以从这个开始我会这样做:
将a1
和a2
连接在一起。(它们不需要分开)
按id分组对象并合并共享相同id的对象
最后,获取所有合并对象
const res=
烟斗(
康卡特,
reduceBy(mergeLeft,{},prop('id')),
价值观);
console.log(
res(a1、a2)
);代码>
const{pipe,concat,reduceBy,mergeLeft,values,prop}=R;
常量a1=[{id:1,名称:'jon'},{id:2,名称:'adam'}];
常量a2=[{id:1,年龄:42},{id:2,年龄:13}];
非常好,您的解决方案也可以使用,另外还有一个好处,即阵列可以按任何顺序排列,并且仍将按id合并。。好的,你确定吗?我尝试过交换a2的顺序,但它仍然有效。我回复其他人说,如果切换顺序,您的解决方案将不起作用,但它确实起作用。另一个家伙从外表上删除了他的评论是的,那评论是我的。我看了一下这篇文章的修改,它们都很好。我一定是被其他有缺陷的答案弄糊涂了。因为那个评论不再相关,我把它删掉了。顺便说一句,我也取消了我的否决票。Thnx,在@JohnHarrison提到之前,我没有费心重新检查,所以我添加了这个片段来确保。请注意,R.merge
是不推荐的。而且这只是偶然的,因为a1
和a2
中的对象排列得很好。如果您交换a2
中的对象,{id:1,name:'jon'}
将与{id:2,age:13}
合并,给出{age:13,“id:2,”name:“jon”}
至于这里的一些其他答案,这仍然依赖于a1
和a2
按id
排序。如果交换a2
中对象的顺序,则最终会出现错误的合并,例如{“age”:13,“id”:2,“name”:“jon”}
不仅是对问题的一个很好的回答,而且涵盖了数组顺序不同的情况,或者其中一个数组包含与另一个数组中的任何元素都不匹配的情况。它还可以通过R.reduce(res,[])
轻松地扩展到输入数组。干得好!你的解决方案当然是最整洁的,我也可以遵循。。。然而,安东斯也能工作,尽管我很难找出原因!
{"0": {"age": 42, "id": 1, "name": "jon"}, "1": {"age": 13, "id": 2, "name": "adam"}}