合并两个 JSON 对象数组的 JSON 属性(使用 ramda)

Merging JSON properties for two arrays of JSON objects (using ramda)

假设我有两个数组如下:

let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{id:1, age:42}, {id:2, age:13}]

我想合并两个数组,以便 JSON 属性合并到一个数组中;即这就是我想要结束的:

[{ 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)}
})

这是一个有效的 Fiddle https://jsfiddle.net/gshfo7pm/

试试这个:

let a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}]
let a2 = [{age:13, id:2}, {id:1, age:42}]

const fn = R.pipe(
   R.map(R.indexBy(R.prop('id'))),
   R.reduce(R.mergeWith(R.mergeDeepLeft), {}),
   R.values
)
    
let newArray1 = fn([a1, a2]);
let newArray2 = fn([a2, a1]);
    
console.log(newArray1);
console.log(newArray2);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

你可以用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)
));
let concatValues = (k, l, r) =>  r
R.mergeDeepWithKey(concatValues,a1,a2)

会产生这个

{"0": {"age": 42, "id": 1, "name": "jon"}, "1": {"age": 13, "id": 2, "name": "adam"}}

这不是准确的输出,但您可以从这个开始

我会这样做:

  1. a1a2 连接在一起。 (他们不需要分开)
  2. 按 ID 对对象进行分组并合并共享相同 ID 的对象。
  3. 终于把所有合并的对象都取出来了。

const res =
  pipe(
    concat,
    reduceBy(mergeLeft, {}, prop('id')),
    values);

console.log(

  res(a1, a2)

);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>
const {pipe, concat, reduceBy, mergeLeft, values, prop} = R;
const a1 = [{id:1, name:'jon'}, {id:2, name:'adam'}];
const a2 = [{id:1, age:42}, {id:2, age:13}];
</script>