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

如何在JavaScript中获取数组中重复元素的所有索引并生成二维数组

如何在JavaScript中获取数组中重复元素的所有索引并生成二维数组

嘿,我完全get到你的需求了——你已经能找出数组里的重复元素,但还想把每个重复元素的所有出现索引整理成对应的二维数组,而且因为数据量不小(1500+条),得找个高效的方法对吧?

首先,你之前用filter找重复元素的思路没问题,但要收集索引的话,先一次性统计所有元素的索引,再筛选重复项会高效得多,毕竟1500条数据的话,多次遍历数组会拖慢性能,而这种方法只需要遍历原数组一次,时间复杂度是O(n),非常适合大数据量。

下面给你具体的实现方案,一步一步来:

第一步:先收集所有元素的索引

我们可以用Map(对数字键的处理更直观,比普通对象更适合这个场景)来存储每个元素对应的所有索引,遍历原数组时把每个元素的索引push到对应的数组里:

const exam = [1, 2, 3, 7, 2, 4, 5, 4, 5, 7];
const indexMap = new Map();

// 遍历数组,收集每个元素的所有索引
exam.forEach((score, index) => {
  // 如果当前元素还没在Map里,就初始化一个空数组
  if (!indexMap.has(score)) {
    indexMap.set(score, []);
  }
  // 把当前索引push到对应元素的数组里
  indexMap.get(score).push(index);
});

这一步跑完后,indexMap的结构是这样的:

1: [0], 2: [1,4], 3: [2], 7: [3,9], 4: [5,7], 5: [6,8]

第二步:筛选出重复元素的索引数组并转成二维数组

接下来,我们只需要从indexMap里提取那些索引数组长度大于1的项(也就是出现过至少两次的元素),转成二维数组就行:

const result = Array.from(indexMap.values())
  .filter(indexArr => indexArr.length > 1);

console.log(result);
// 输出:[[1,4], [3,9], [5,7], [6,8]]

哦对了,你的原数组里7其实也出现了两次(索引3和9),之前的预期结果里没提到,这个方法会自动把它也包含进去。如果你只想要之前filter得到的[2,4,5]对应的索引,那可以先把重复元素去重,再从indexMap里提取:

// 先获取去重后的重复元素
const duplicates = exam.filter((item, index) => exam.indexOf(item) !== index);
const uniqueDuplicates = [...new Set(duplicates)]; // 得到[2,4,5,7],如果只想要2、4、5可以手动过滤

// 提取对应元素的索引数组
const targetResult = uniqueDuplicates.map(score => indexMap.get(score));
console.log(targetResult);
// 输出:[[1,4], [5,7], [6,8], [3,9]]

为什么这个方法适合大数据量?

相比用for循环多次查找索引,或者多次调用indexOf(每次indexOf都是O(n)的时间复杂度),这个方法只需要遍历原数组一次,后续的操作都是线性的,对于1500条数据来说完全没压力,性能会好很多。

如果用jQuery的话,思路也是一样的,只是遍历数组的方式换成$.each,但原生JS的forEach或者for...of已经足够高效了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 14:39:36