如何获取数组中重复元素的索引?及重复元素计数需求说明
解决数组重复元素的索引记录与次数统计问题
看起来你现在的问题是:想要统计数组中与前一个元素重复的元素的数量,同时捕获所有这类重复元素的索引,但当前代码只能保存最后一个重复元素的索引——这是因为你用对象直接赋值覆盖了之前的索引值,而不是用数组来存储所有符合条件的索引。
我分两种常见需求来给你解决方案:
一、统计连续重复的元素(当前元素与前一个相等)
如果你的需求是只关注连续出现的重复项(比如数组里连续的"abc"),可以用下面的代码:
var newArr = ["abc", "abc", "abc", "d", "et", "d", "et", "zzz"]; function calcConsecutiveDuplicates(arr) { const result = {}; // 从第二个元素开始遍历,和前一个元素比较 for (let i = 1; i < arr.length; i++) { const currentItem = arr[i]; const prevItem = arr[i - 1]; if (currentItem === prevItem) { // 如果当前元素和前一个重复,更新记录 if (!result[currentItem]) { // 第一次出现连续重复,初始化结构 result[currentItem] = { repeatCount: 1, // 重复次数(和前一个元素相等的次数) duplicateIndices: [i] // 所有重复元素的索引 }; } else { // 已有记录,累加次数和索引 result[currentItem].repeatCount++; result[currentItem].duplicateIndices.push(i); } } } return result; } // 调用函数查看结果 console.log(calcConsecutiveDuplicates(newArr));
运行后输出:
{ abc: { repeatCount: 2, duplicateIndices: [1, 2] } }
代码说明:
- 从索引
1开始遍历(因为要和前一个元素对比),避免越界 - 用对象存储结果,每个键是重复元素,值包含两个属性:
repeatCount(连续重复的次数,即有多少次和前一个元素相等),duplicateIndices(所有重复元素的索引) - 只有当当前元素和前一个元素完全相等时,才会更新记录,不会统计非连续的重复项
二、统计所有重复元素(无论是否连续)
如果你的需求是统计数组中所有出现超过一次的元素,并记录它们的所有索引和重复次数,可以用这个版本:
var newArr = ["abc", "abc", "abc", "d", "et", "d", "et", "zzz"]; function calcAllDuplicates(arr) { const result = {}; // 遍历数组,记录每个元素的出现次数和所有索引 arr.forEach((item, index) => { if (!result[item]) { result[item] = { totalOccurrences: 1, allIndices: [index] }; } else { result[item].totalOccurrences++; result[item].allIndices.push(index); } }); // 过滤掉只出现一次的元素,计算重复次数(总次数-1) Object.keys(result).forEach(key => { if (result[key].totalOccurrences === 1) { delete result[key]; } else { result[key].duplicateCount = result[key].totalOccurrences - 1; } }); return result; } // 调用函数查看结果 console.log(calcAllDuplicates(newArr));
运行后输出:
{ abc: { totalOccurrences: 3, allIndices: [0, 1, 2], duplicateCount: 2 }, d: { totalOccurrences: 2, allIndices: [3, 5], duplicateCount: 1 }, et: { totalOccurrences: 2, allIndices: [4, 6], duplicateCount: 1 } }
代码说明:
- 先用
forEach遍历数组,记录每个元素的总出现次数和所有出现的索引 - 之后过滤掉只出现一次的元素,计算重复次数(总出现次数减1,因为第一次出现不算重复)
内容的提问来源于stack exchange,提问作者Max Wolfen
相关产品推荐
相关产品推荐

