JavaScript:如何基于含重复元素数组计算对应元素索引总和
解决数组元素对应索引求和的问题
你的问题出在indexOf()方法的特性上——它只会返回第一个匹配元素的索引,所以每次遇到0都取0,遇到1都取4,最终总和是0+4+0+4=8,和你预期的10不符。
要实现“第一个数组中每个元素依次匹配第二个数组里对应元素的下一个出现位置”的需求,我们可以先预处理第二个数组,把每个值对应的所有索引存起来,然后遍历第一个数组时依次取出对应索引累加。
解决方案代码
// 定义两个目标数组 const sourceArr = [0, 1, 0, 1]; const targetArr = [0, 0, 0, 0, 1, 1]; // 第一步:构建值到索引列表的映射 const indexMap = targetArr.reduce((map, value, index) => { // 如果当前值还没有对应的索引数组,就初始化一个空数组 if (!map[value]) { map[value] = []; } // 将当前索引加入对应值的数组 map[value].push(index); return map; }, {}); // 第二步:遍历第一个数组,依次取出对应索引累加 const result = sourceArr.reduce((acc, currentVal) => { // 获取当前值需要取的索引位置(默认从0开始) const currentIndex = acc.pointers[currentVal] || 0; // 累加对应的索引值 acc.sum += indexMap[currentVal][currentIndex]; // 更新指针,下次取下一个索引 acc.pointers[currentVal] = currentIndex + 1; return acc; }, { sum: 0, pointers: {} }).sum; console.log(result); // 输出10
代码解释
- 构建索引映射:通过
reduce遍历第二个数组,把每个值对应的所有出现索引都存在一个对象里,最终indexMap的结构是{0: [0,1,2,3], 1: [4,5]}。 - 累加计算总和:再次用
reduce处理第一个数组,维护一个累加器对象,里面包含当前总和sum和每个值的取数指针pointers。每遇到一个值,就从对应的索引列表里取出指针指向的位置,累加后把指针+1,确保下次取下一个索引。
这样就能准确得到你预期的结果10了。
内容的提问来源于stack exchange,提问作者user8840209
相关产品推荐
相关产品推荐

