JavaScript:largestOfFour函数报TypeError的原因排查及问题求解
问题分析与修复
首先,你的代码出现类型错误的核心原因是错误地覆盖了原二维数组arr,导致后续循环处理的不再是数组。我们一步步拆解问题:
1. 原代码的致命错误
在循环里你写了:
arr = arr[i].sort(function(a, b) { return b - a; });
第一次循环时(i=0),arr[i]是第一个子数组[4,5,1,3],调用sort()后得到排序后的一维数组[5,4,3,1],然后你把这个一维数组赋值给了原来的arr变量。
这时候,原来的二维数组已经被替换成了一维数组。当第二次循环(i=1)执行时,arr现在是一维数组,arr[1]是数字4——而数字类型根本没有sort()方法,自然就抛出了is not a function的类型错误。
另外,你定义了largestNumArray但完全没使用,函数也没有返回值,就算逻辑正确也拿不到最终结果。
2. 修正后的代码
我们需要保留原二维数组的结构,对每个子数组单独排序,这里分两种常见需求给出修复方案:
需求1:将每个子数组从大到小排序,返回处理后的二维数组
function largestOfFour(arr) { // 创建新数组存储结果,避免修改原数组 const sortedArray = []; for(let i = 0; i < arr.length; i++) { // 用slice()创建子数组副本,排序后推入结果数组 const sortedSubArr = arr[i].slice().sort(function(a, b) { return b - a; }); sortedArray.push(sortedSubArr); } return sortedArray; } // 测试 console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])); // 输出: [[5,4,3,1],[27,26,18,13],[39,37,35,32],[1001,1000,857,1]]
需求2:如果函数名largestOfFour是要取每个子数组的最大值(更常见的场景)
function largestOfFour(arr) { const largestNumArray = []; for(let i = 0; i < arr.length; i++) { // 排序后取第一个元素就是最大值,或者用Math.max(...arr[i])更高效 const max = arr[i].sort(function(a, b) { return b - a; })[0]; largestNumArray.push(max); } return largestNumArray; } // 测试 console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]])); // 输出: [5,27,39,1001]
额外注意点
- 循环里要使用
let i(或const)避免全局变量污染; - 如果不想修改原数组,记得用
slice()创建子数组的副本再排序,否则原数组会被直接改变。
内容的提问来源于stack exchange,提问作者Suraj Somai
相关产品推荐
相关产品推荐

