如何使用JavaScript的reduce方法结合split获取无重复的组ID数组
使用JavaScript的reduce方法提取唯一组ID数组
我来帮你搞定这个问题!你的思路方向是对的,但reduce的返回逻辑有点小问题,咱们一步步修正它,同时还能优化效率。
先分析你现有代码的问题
你的代码里有两个关键错误:
- 当
acc已经包含groupId时,你返回了[splited],这会直接把之前积累的结果替换成当前拆分后的数组,完全打乱了积累的逻辑; - 不包含groupId时,你把原
item(比如'JJ2AG-001099')加到了acc里,但你需要的是组ID(JJ2AG)而不是完整字符串。
基础修正版代码
先给你一个最直观的修正方案,完全符合你的需求:
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const uniqueGroups = ids.reduce((acc, item) => { // 拆分字符串,直接取组ID const groupId = item.split('-')[0]; // 如果acc里没有这个组ID,就添加进去;否则返回原acc return acc.includes(groupId) ? acc : [...acc, groupId]; }, []); console.log(uniqueGroups); // 输出: ['JJ2AG', 'JJ3AG', 'JJ4AG']
高效优化版代码
上面的方法用acc.includes()判断是否存在,每次都要遍历整个数组,当你的数据量很大时,效率会比较低。我们可以结合Set(它的唯一性特性和O(1)的查找效率)来优化:
const ids = ['JJ2AG-001099', 'JJ2AG-001999', 'JJ3AG-001999', 'JJ4AG-001999']; const uniqueGroups = [...ids.reduce((acc, item) => { // 往Set里添加组ID,Set自动忽略重复值 acc.add(item.split('-')[0]); // 返回更新后的Set return acc; }, new Set())]; // 初始值设为一个空Set console.log(uniqueGroups); // 输出: ['JJ2AG', 'JJ3AG', 'JJ4AG']
这个方法的核心是用reduce构建一个存储唯一组ID的Set,最后通过扩展运算符[...]把Set转换成数组,效率比基础版高很多,尤其适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

