如何通过id合并Node.js中的值数组?

时间:2018-02-09 05:16:45

标签: node.js

我正在寻找一种有效合并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"
    }    

3 个答案:

答案 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

如果您不希望修改ab,请使用

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);