寻找数组最大值的JS函数首元素为undefined/NaN时失效
解决数组最大值函数忽略非数值元素的问题
问题根源
你的函数核心问题有两个:
- 初始值
biggest直接取数组第一个元素,若该元素是undefined、null或NaN,后续所有数值与它的比较都会返回false,导致最大值无法更新; - 之前修改的判断条件仅校验了当前元素非空,但未确认它是有效数值(比如
NaN属于number类型,但无法参与有效比较)。
解决方案
方法一:过滤有效数值后取最大值(简洁高效)
先过滤数组中所有符合要求的有效数值,再用内置Math.max方法获取最大值,逻辑清晰且不易出错:
const biggestNumOfArray = (array) => { if (!Array.isArray(array)) return NaN; // 仅保留类型为number且不是NaN的元素 const validNumbers = array.filter(item => typeof item === 'number' && !isNaN(item)); // 无有效数值返回NaN,否则返回最大值 return validNumbers.length === 0 ? NaN : Math.max(...validNumbers); }
测试你的示例数组[undefined, 8, 74, -22, 269.64, 92],会返回预期的269.64;若输入数组全是非数值元素(如[null, NaN, 'abc']),则返回NaN。
方法二:手动遍历优化(精细控制)
如果需要手动控制遍历过程,可以先找到第一个有效数值作为初始最大值,再遍历后续元素更新:
const biggestNumOfArray = (array) => { if (!Array.isArray(array)) return NaN; let biggest; // 先定位第一个有效数值 for (const item of array) { if (typeof item === 'number' && !isNaN(item)) { biggest = item; break; } } // 无有效数值直接返回NaN if (typeof biggest !== 'number') return NaN; // 遍历剩余元素更新最大值 for (let i = array.indexOf(biggest) + 1; i < array.length; i++) { const item = array[i]; if (typeof item === 'number' && !isNaN(item) && item > biggest) { biggest = item; } } return biggest; }
关键校验逻辑
判断一个元素是否为有效数值,必须同时满足:
typeof item === 'number':排除字符串、对象等非数值类型;!isNaN(item):排除NaN(因为NaN的类型是number,但无法参与有效比较)。
内容的提问来源于stack exchange,提问作者danik0011
相关产品推荐
相关产品推荐

