JavaScript查找排除0值的数组最小值及索引的迭代问题排查
数组最值计算逻辑问题排查
需求说明
给定包含0元素的数值数组,排除值为0的元素后,找到数组最小值并输出其对应索引。
待处理测试数组
[ 10, 5, 6, 5.5, 3.75, 0, 4.25, 3, 5.5, 6.75, 8, 9.25, 4, 15, 4.25, 6, 6, 4.75, 3.75 ]
原有错误实现
var smallest = 0 var biggest = 0 for (let i = 0; i < merged.length; i++) { if (merged[i] > biggest && merged[i] != 0) { biggest = merged[i]; } else merged[i] < smallest ? smallest = merged[i] : smallest = merged[i]; console.log('the biggest is', biggest, 'in the iteration', i) console.log('the smallest is', smallest, 'in the iteration', i) } console.log('min-> : ', smallest, biggest);
原有代码最终输出最小值为3.75,最大值为15,和预期最小值3不符。
错误原因
- 初始值设置错误:
smallest初始值设为0,而0是需要排除的元素,初始值取0会直接干扰后续比较逻辑 - 分支逻辑未过滤0值:最大值判断的else分支没有跳过0元素,遍历到索引为5的0元素时,
smallest被直接重置为0,后续所有比0大的元素都会错误覆盖smallest的值 - 三元表达式逻辑完全无效:
merged[i] < smallest ? smallest = merged[i] : smallest = merged[i]无论条件是否成立,都会执行smallest = merged[i],等价于每轮只要没进入最大值分支,就直接把当前元素值赋值给smallest,完全没有「和当前最小值比较、保留更小值」的逻辑,这就是输出中smallest从5错误跳变为6的根本原因 - 缺失索引记录逻辑:原需求需要输出最小值对应索引,原有代码没有定义相关变量存储索引位置
修正后实现
const merged = [ 10, 5, 6, 5.5, 3.75, 0, 4.25, 3, 5.5, 6.75, 8, 9.25, 4, 15, 4.25, 6, 6, 4.75, 3.75 ] // 初始化最值和对应索引,初始值为空避免干扰比较 let smallest = null let smallestIndex = -1 let biggest = null let biggestIndex = -1 for (let i = 0; i < merged.length; i++) { const currentVal = merged[i] // 直接跳过0值,不参与最值计算 if (currentVal === 0) continue // 用第一个非0值初始化最值 if (smallest === null) { smallest = currentVal smallestIndex = i biggest = currentVal biggestIndex = i continue } // 更新最大值 if (currentVal > biggest) { biggest = currentVal biggestIndex = i } // 和当前最小值比较,更小则更新 if (currentVal < smallest) { smallest = currentVal smallestIndex = i } console.log('the biggest is', biggest, 'in the iteration', i) console.log('the smallest is', smallest, 'in the iteration', i) } console.log('排除0后的最小值:', smallest, '对应索引:', smallestIndex) console.log('排除0后的最大值:', biggest, '对应索引:', biggestIndex)
运行上述代码可得到正确结果:排除0后的最小值为3,对应索引为7。
内容的提问来源于stack exchange,提问作者George Moraitis
相关产品推荐
相关产品推荐

