You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:18:31