为何调用自定义compare函数处理温度数组以获取最大值,数组却未发生任何变化?
问题排查:调用函数后数组无变化的原因及修复方案
嘿,我来帮你拆解这个问题!首先最核心的问题一眼就能看穿——你定义了compare函数,但从头到尾根本没调用它!你的代码最后直接console.log(temperature),但从来没执行compare(temperature),原数组自然不会有任何变化啦。
就算你补上函数调用,这个函数内部还有一堆逻辑问题,导致它要么报错,要么达不到“获取最高温度”的目的,我一一给你分析:
函数内部的关键问题
1. 第一个循环:删除字符串元素时的索引漏洞
当你用splice(i, 1)删除数组元素时,数组的长度会立刻变短,但循环的i还在继续递增,这会导致你跳过下一个元素。比如如果数组里有连续的字符串元素,后面的那个会被漏掉。而且这种直接在循环里修改原数组长度的写法很容易出问题,更稳妥的方式是用filter过滤出有效元素。
2. 第二个循环:逻辑完全失效+语法错误
- 第一个循环结束后,
i的值等于原数组的长度(因为循环条件是i < temperature.length,每次循环i++),但经过第一个循环的删除操作,数组已经变短了,所以k = i + 1会远大于当前数组的长度,第二个循环根本不会执行。 - 你写了
Array.splice(i, 1),这是错误的——splice是数组实例的方法,不是Array构造函数的方法,这么写会直接报错。应该用temperature.splice(...)。 - 退一步说,这个循环的逻辑本身就不对:你想通过删除较小元素来保留最大值,但这种方式会把数组删得乱七八糟,完全达不到找最大值的目的。
3. 整体逻辑偏差
你的目标是获取最高温度,但当前函数试图通过修改原数组来实现,这既低效又容易出错。其实完全不需要修改原数组,直接过滤有效元素后找出最大值即可。
修复后的代码示例
如果你想获取最高温度且不修改原数组,可以这么写:
let temperature = [1, 2, 3, 4, 5, 6, 7, 8, 9, "error"]; function getMaxTemperature(arr) { // 先过滤出所有数字类型的温度值 const validTemps = arr.filter(item => typeof item === "number"); // 处理没有有效温度的情况 if (validTemps.length === 0) return "无有效温度数据"; // 找出最大值 return Math.max(...validTemps); } // 一定要调用函数! const maxTemp = getMaxTemperature(temperature); console.log("最高温度:", maxTemp); // 输出 9 console.log("原数组:", temperature); // 原数组保持不变
如果你确实需要修改原数组,只保留最高温度,可以这么写:
let temperature = [1, 2, 3, 4, 5, 6, 7, 8, 9, "error"]; function keepOnlyMaxTemperature(arr) { const validTemps = arr.filter(item => typeof item === "number"); if (validTemps.length === 0) { arr.length = 0; // 清空原数组 return arr; } const maxTemp = Math.max(...validTemps); // 清空原数组并插入最大值 arr.length = 0; arr.push(maxTemp); return arr; } // 调用函数修改原数组 keepOnlyMaxTemperature(temperature); console.log(temperature); // 输出 [9]
总结
- 永远记得:定义函数后一定要调用它,不然函数里的逻辑永远不会执行;
- 处理数组元素过滤时,优先用
filter这种不修改原数组的方法,比循环删除更安全; - 找数组最大值直接用
Math.max,简洁高效,不要用删除元素的方式绕弯路; - 调用数组方法时,要操作具体的数组实例,不要误操作
Array构造函数。
内容的提问来源于stack exchange,提问作者Ali Elhhaggar
相关产品推荐
相关产品推荐

