如何用JavaScript或UnderscoreJS按属性查找并合并重复对象?
使用UnderscoreJS高效合并重复code的数组元素
当然可以用UnderscoreJS实现这个需求,而且它的内置方法都是经过性能优化的,非常适合你说的包含10个属性的大型JSON数组场景,比手写for循环更简洁易维护,性能也有保障。
实现思路
核心就是两步:
- 先用
_.groupBy把数组按code属性分组,把相同code的元素归到同一组里 - 再用
_.map遍历分组后的结果,将每个组里的name属性合并,同时保留其他属性(比如你的场景里的10个属性,只需要调整合并的逻辑即可)
完整代码示例
// 你的原始数组 var somevalue = [{ code: 1, name: 'a1' }, { code: 2, name: 'b1' }, { code: 1, name: 'a2' }, { code: 1, name: 'a3' }, { code: 2, name: 'b2' } ]; // 使用UnderscoreJS处理 var mergedResult = _.map(_.groupBy(somevalue, 'code'), function(group, code) { return { code: parseInt(code, 10), // 把键转成数字类型,和原始数组类型保持一致 name: _.pluck(group, 'name').join(', ') // 如果还有其他10个属性,这里可以按需处理: // 若属性在组内值一致,直接取 group[0].attrName // 若需要合并,就用 _.pluck(group, 'attrName').join('分隔符') // 示例:attr1: group[0].attr1, attr2: _.pluck(group, 'attr2').join('; ') }; }); console.log(mergedResult); // 输出结果: // [{ code: 1, name: 'a1, a2, a3' }, { code: 2, name: 'b1, b2' } ]
性能说明
Underscore的_.groupBy和_.map都是底层优化过的方法,整个过程只需要两次遍历(一次分组、一次转换),比很多手写嵌套查找的for循环性能更稳定。对于大型数组来说,这种方式既保证了代码可读性,又不会牺牲性能。
内容的提问来源于stack exchange,提问作者ConfusedDeveloper
相关产品推荐
相关产品推荐

