JS数组去除最高最低值求和函数无法通过测试的问题排查
错误原因
你的边界判断逻辑存在本质错误,根本没有正确识别需要返回0的场景:
- 你写的
array < 1是依赖JS隐式类型转换的错误写法:数组和数字比较时会被尝试转成数字,完全无法正确判断数组长度。比如传入单元素数组[5]时,数组转数字结果为5,5 < 1返回false,会错误进入后续求和逻辑;传入多元素数组时转换结果为NaN,所有比较都返回false,长度不足3的数组也会走到求和步骤。 - 判断顺序存在隐患:你先执行
array < 1再判断array == null,如果传入undefined,undefined < 1返回false,后续对undefined做展开操作会直接抛出类型错误。 - 没有覆盖全量边界场景:逻辑要求所有长度小于3的输入(空数组、单元素数组、双元素数组)、空值输入都要返回0,你的判断逻辑完全漏过了元素值大于等于1的单/双元素数组场景。以单元素数组
[3]为例,走到求和逻辑后:- 无初始值的
reduce在单元素数组上直接返回元素本身3 Math.max(...[3])和Math.min(...[3])结果都是3- 最终计算结果为
3 - 3 -3 = -3,和预期返回0的要求不符,自然无法通过测试。
你本地测试[-3]能返回0只是巧合:[-3]转数字是-3,刚好满足-3 < 1的判断条件触发返回0,不代表逻辑正确。
- 无初始值的
修正方案
不要用隐式转换做判断,直接校验输入合法性和数组长度,修正后代码如下:
function sumArray(array) { // 先判断空值,再判断数组长度是否满足计算要求 if (array == null || array.length < 3) return 0; const sum = array.reduce((a, b) => a + b, 0); return sum - Math.max(...array) - Math.min(...array); } // 测试用例 console.log(sumArray([-3])) // 0 符合预期 console.log(sumArray([3])) // 0 修复后返回正确 console.log(sumArray([1,2])) // 0 修复后返回正确 console.log(sumArray([6, 2, 1, 8, 10])) // 16 计算逻辑正确:总和27 - 10 -1 =16 console.log(sumArray(null)) // 0 运行不报错
注意:给
reduce传入初始值0是更稳妥的写法,避免空数组调用reduce抛错,虽然前面已经做了长度判断,但加初始值不会有额外副作用。
内容的提问来源于stack exchange,提问作者user19557135
相关产品推荐
相关产品推荐

