合并两个 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"}}
这不是准确的输出,但您可以从这个开始
我会这样做:
- 将
a1
和 a2
连接在一起。 (他们不需要分开)
- 按 ID 对对象进行分组并合并共享相同 ID 的对象。
- 终于把所有合并的对象都取出来了。
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>
假设我有两个数组如下:
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"}}
这不是准确的输出,但您可以从这个开始
我会这样做:
- 将
a1
和a2
连接在一起。 (他们不需要分开) - 按 ID 对对象进行分组并合并共享相同 ID 的对象。
- 终于把所有合并的对象都取出来了。
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>