多条件循环问题:为何addedOddNumbers计算不符合预期?
问题:相同逻辑处理数组结果不同的原因及修复方案
我原本想简化代码、减少变量且只修改原array1,但用for循环时发现addedOddNumbers(最终值为9)没正确加到array1的奇数元素上,于是把代码拆分开来。拆分后用for循环把addedEvenNumbers加入over10得到了预期的[23,21],但用相同逻辑把addedOddNumbers加入under10时,得到的是[2,4,9]而非预期结果。addedEvenNumbers的输出符合预期,为什么逻辑相同的两个处理结果不一样?希望尽可能贴近现有代码解决,看不懂其他方案。
代码示例
function addingAllTheWeirdStuff(array1, array2) { let addedOddNumbers = 0 // 9 let addedEvenNumbers = 0 // 6 let under10 = [] // 1, 3, 5 let over10 = [] // 17, 15 let result = [] // should be 10, 12, 14, 23, 21 --- current result is 2, 4, 9, 23, 21 for (let i = 0; i < array2.length; i++) { if (array2[i] % 2 === 1) { addedOddNumbers += array2[i] } if (array2[i] % 2 === 0) { addedEvenNumbers += array2[i] } if (array1[i] < 10) { under10.push(array1[i] + addedOddNumbers) } if (array1[i] > 10) { over10.push(array1[i] + addedEvenNumbers) } } console.log(addedOddNumbers) console.log(addedEvenNumbers) console.log(under10) // why???? console.log(over10) // this works fine but why not under10? result.push(...under10, ...over10) console.log(result) } console.log(addingAllTheWeirdStuff([1, 3, 5, 17, 15], [1, 2, 3, 4, 5])); // expected log [10, 12, 14, 23, 21]
问题原因
核心问题是你在同一个循环里同时做了两件事:一边累加addedOddNumbers/addedEvenNumbers的中间值,一边用当前的中间值去计算under10和over10的元素。
具体执行过程:
- 前三次循环(i=0、1、2)处理的是
array1中<10的元素,此时addedOddNumbers还在累加过程中(从1→4→9),每次都是用当前的中间值和array1元素相加,所以得到2、4、9。 - 后两次循环(i=3、4)处理的是
array1中>10的元素,此时addedEvenNumbers已经累加完所有偶数(2+4=6),所以用最终值相加得到了正确的23、21。
说白了,over10的结果正确只是巧合——恰好array1的大数在数组后半段,此时偶数累加已经完成;而under10的小数在前半段,奇数累加还没结束。
贴近原代码的修复方案
把累加值计算和结果数组生成拆成两个独立循环,确保计算under10和over10时,addedOddNumbers和addedEvenNumbers已经是array2中所有奇数/偶数的总和:
function addingAllTheWeirdStuff(array1, array2) { let addedOddNumbers = 0 // 最终为9 let addedEvenNumbers = 0 // 最终为6 let under10 = [] let over10 = [] let result = [] // 第一步:先计算完所有奇数和偶数的累加总和 for (let i = 0; i < array2.length; i++) { if (array2[i] % 2 === 1) { addedOddNumbers += array2[i] } if (array2[i] % 2 === 0) { addedEvenNumbers += array2[i] } } // 第二步:用最终的累加值计算结果数组 for (let i = 0; i < array1.length; i++) { if (array1[i] < 10) { under10.push(array1[i] + addedOddNumbers) } if (array1[i] > 10) { over10.push(array1[i] + addedEvenNumbers) } } console.log(addedOddNumbers) console.log(addedEvenNumbers) console.log(under10) // 现在输出 [10, 12, 14] console.log(over10) // 依然输出 [23, 21] result.push(...under10, ...over10) console.log(result) return result } console.log(addingAllTheWeirdStuff([1, 3, 5, 17, 15], [1, 2, 3, 4, 5])); // 输出预期的 [10, 12, 14, 23, 21]
这样拆分后,两个逻辑的执行时机完全统一,就不会出现结果不一致的问题了。
内容的提问来源于stack exchange,提问作者DeBoer753
相关产品推荐
相关产品推荐

