合并数组中的重复对象

时间:2019-02-21 14:35:10

标签: javascript arrays angular typescript object

我有一个如下数组:

original = [
{
 id:1,
 value1 : 500
},
{
 id:1,
 value2 : 600
},
{
 id:2,
 value1 : 700
},
{
 id:3,
 value2 : 750
}
];

我想合并上面数组中的重复对象,并希望最终输出数组如下:

finalArr = [
 {
  id:1,
  value1:500,
  value2:600
},
{
 id:2,
 value1:700,
 value2:null
},
{
 id: 3,
 value1: null,
 value2:750
}
];

如何使用JavaScript或TypeScript实现此目的?

4 个答案:

答案 0 :(得分:3)

您可以使用简化的地图组合

const original = [
    {
        id:1,
        value1 : 500
    },
    {
        id:1,
        value2 : 600
    },
    {
        id:2,
        value1 : 700
    },
    {
        id:3,
        value2 : 750
    }
];

const res = [...original.reduce(
    (a, b) => a.set(b.id, Object.assign((a.get(b.id) || {value2: null, value1: null, id: null}), b)),
    new Map
).values()];

console.log(res);

答案 1 :(得分:0)

您可以使用lodash uniquniqBy函数

original = _.uniq(original);

original = _.uniqBy(original, 'id');

否则,您可以使用reduce进行检查

let original = [
    {
        id: 1,
        value1: 500
    },
    {
        id: 1,
        value2: 600
    },
    {
        id: 2,
        value1: 700
    },
    {
        id: 3,
        value2: 750
    }
];

original = original.reduce((sum, val) => {
    for (let i in sum) {
        if (sum[i].id === val.id) {
            return sum;
        }
    }
    sum.push(val);
    return sum;
}, []);

答案 2 :(得分:0)

您可以对每个使用普通的

let result = [];
original.forEach(elem => {
  let match = result.find(r => r.id === elem.id);
  if(match) {
    Object.assign(match, elem);
  } else {
    result.push(elem);
  }
});

答案 3 :(得分:0)

您可以使用Map并使用相同的id收集所有对象,然后仅获取地图的值作为结果。

var original = [{ id: 1, value1: 500 }, { id: 1, value2: 600 }, { id: 2, value1: 700 }, { id: 3, value2: 750 }],
    template = { id: null, value1: null, value2: null },
    result = Array.from(
        original
            .reduce(
                (m, o) => m.set(o.id, Object.assign({}, m.get(o.id) || template, o)),
                new Map
            )
            .values()
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }