You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:39:06