如何合并JavaScript数组中ts字段值相同的多个对象
错误原因
原有实现直接将全量数组对象展开合并到单个对象中,相同的ts属性会被后续元素覆盖,最终仅保留最后一个ts对应的合并结果,不符合按ts分组合并的需求。
正确实现
先按ts字段分组,对同组的对象做属性合并,最终将分组结果转为数组即可,示例代码如下:
const mergeArrayOfObjs = (arr) => { const groupMap = new Map(); arr.forEach(item => { const exist = groupMap.get(item.ts); groupMap.set(item.ts, exist ? {...exist, ...item} : {...item}); }); return Array.from(groupMap.values()); }; const result = mergeArrayOfObjs(array); console.log(result);
如果追求更简洁的写法,也可以用reduce实现:
const result = Object.values(array.reduce((acc, cur) => { acc[cur.ts] = {...acc[cur.ts] || {}, ...cur}; return acc; }, {}));
输出结果
两种写法最终输出都符合预期:
[ { ts: 1596232800, v1: 1, b2: 10, c3: 20 }, { ts: 1596232860, v1: 2, b2: 11, c3: 21 }, { ts: 1596232920, v1: 3, b2: 12, c3: 22 } ]
内容的提问来源于stack exchange,提问作者Dev M
相关产品推荐
相关产品推荐

