如何使用lodash处理数组重复元素,不删除而是合并存储到内部数组
实现代码(JavaScript)
// 原始数据 const originalArr = [{letter: 'a', number: 1}, {letter: 'a', number: 2}, {letter: 'a', number: 3}, {letter: 'b', number: 1}, {letter: 'b', number: 2}, {letter: 'a', number: 4}, {letter: 'b', number: 1}, {letter: 'a', number: 3}]; const result = Object.values(originalArr.reduce((acc, cur) => { // 以letter作为分组唯一标识 const groupKey = cur.letter; // 对应分组不存在时初始化结构 if (!acc[groupKey]) { acc[groupKey] = { letter: groupKey, numbers: [] }; } // 校验当前number是否已存在于分组内,避免重复存储 const numberExisted = acc[groupKey].numbers.some(item => item.number === cur.number); if (!numberExisted) { acc[groupKey].numbers.push({number: cur.number}); } return acc; }, {})); console.log(result);
执行上述代码输出的结果和你要求的预期结构完全一致。
实现原理说明
- 采用
Array.reduce()做分组统计,初始值设置为空对象作为临时存储容器,以letter的值作为键名,查找分组的时间复杂度为O(1),远高于遍历数组查找分组的效率。 - 遍历原始数组的每个元素时,先判断对应
letter的分组是否存在,不存在就初始化符合输出要求的分组结构。 - 用
Array.some()做同分组内number的重复校验,只有未存在的number才会推入分组的numbers数组,实现去重逻辑。 - 最后用
Object.values()提取临时存储对象的所有值,即可得到最终的数组格式结果。
内容的提问来源于stack exchange,提问作者jose fernandez
相关产品推荐
相关产品推荐

