我有一个如下数组:
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实现此目的?
答案 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 uniq
或uniqBy
函数
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; }