如何逐个比较数组元素并生成myNums数组求和?函数故障求助
问题分析与正确实现
给定数组:
let a = [33, 15, 67, 203450, 212]
需求:依次比较数组中每一对相邻元素(前一个与后一个),根据比较结果向myNums数组添加对应值:
- 后一个元素 > 前一个元素:添加2
- 后一个元素 < 前一个元素:添加1
- 两者相等:添加0
最终计算myNums数组中所有元素的总和。
原有函数的问题分析
第一个函数
myNums数组和求和变量sum定义在for循环内部,每次循环都会被重置,无法累计所有结果。- 循环第一次执行就触发
return sum,直接退出函数,仅处理了第一对元素。 - 循环条件
c < cmp.length会导致最后一次循环时cmp[c+1]为undefined,引发无效比较。
第二个函数
while ((c = 0) && (c < cmp.length))中,c = 0是赋值操作而非判断,且逻辑与&&左侧为0(布尔值false),循环根本不会执行。- 内部嵌套的
while循环是死循环:A和B的值不会改变,一旦进入就会持续向数组push元素。 c++写在循环外部,永远无法执行到。
第三个函数
switch(B)的用法错误:switch是匹配表达式的具体值,而case后的A < B等是布尔值,与B的数值类型不匹配,不会进入任何分支。- 所有
case都没有break,即使匹配也会执行后续所有分支。 - 第一次循环就
return C,仅处理了第一对元素,无法完成所有比较。
正确实现方式
方式一:先构建数组再求和
function calculateSum(arr) { const myNums = []; // 循环到倒数第二个元素,避免索引越界 for (let i = 0; i < arr.length - 1; i++) { const prev = arr[i]; const next = arr[i + 1]; if (next > prev) { myNums.push(2); } else if (next < prev) { myNums.push(1); } else { myNums.push(0); } } // 使用reduce计算总和 return myNums.reduce((total, num) => total + num, 0); } const a = [33, 15, 67, 203450, 212]; console.log(calculateSum(a)); // 输出:6
方式二:直接累加(无需存储数组)
如果不需要保留myNums数组,直接计算总和更高效:
function calculateSum(arr) { let sum = 0; for (let i = 0; i < arr.length - 1; i++) { const prev = arr[i]; const next = arr[i + 1]; if (next > prev) { sum += 2; } else if (next < prev) { sum += 1; } // 相等时加0,无需额外处理 } return sum; } const a = [33, 15, 67, 203450, 212]; console.log(calculateSum(a)); // 输出:6
内容的提问来源于stack exchange,提问作者Gor Janikyan
相关产品推荐
相关产品推荐

