如何在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
相关产品推荐
相关产品推荐

