我正在寻找一种有效合并json结构类型值的方法,以便结果具有来自双方的值 - 但是使用id合并。
var a = [
{
id:"1",
value:"one"
},
{
id:"2",
value:"two"
},
{
id:"3",
value:"three"
}
]
var b = [
{
id:"1",
somevalue:"foo"
},
{
id:"2",
anothervalue:"bar"
}
]
我想最终:
[
{
id:"1",
value:"one",
somevalue:"foo"
},
{
id:"2",
value:"two",
anothervalue:"bar"
},
{
id:"3",
value:"three"
}
答案 0 :(得分:4)
您可以使用array#reduce
根据id
对对象进行分组,并使用Object.assign()
在新对象中合并它们,然后使用Object.values()
提取所有值。
var a = [ { id:"1", value:"one" }, { id:"2", value:"two" }, { id:"3", value:"three" } ],
b = [ { id:"1", somevalue:"foo" }, { id:"2", anothervalue:"bar" } ],
merged = Object.values([].concat(a,b).reduce((r,o) => {
r[o.id] = Object.assign(r[o.id] || {}, o);
return r;
},{}));
console.log(merged);

答案 1 :(得分:1)
您可以使用loadash merge
如果您不希望修改a
和b
,请使用
result = _.merge([], a, b)
。
或_.merge(a, b)
,您的结果将在a
。
答案 2 :(得分:1)
使用lodash的简单而干净的解决方案可能是:
var _ = require('lodash');
var mapA = _.indexBy(a, "id");
var mapB = _.indexBy(b, "id");
var mapResult = _.merge({}, mapA, mapB);
var mapValues = _.values(mapResult);
console.log(mapValues);