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"}}