如何理解这段实现4个子数组最大值查找的JavaScript代码?
你对「创建空数组存放后续结果」的理解是完全正确的,先解答你提到的几个疑问,再逐行拆解代码:
- 关于
arr[i][0]:传入的arr是二维数组(数组的每个元素依然是数组),arr[i]代表取外层数组的第i个元素(也就是里面的小数组),arr[i][0]就是取这个小数组的第一个元素,比如i=0时就是取第一个小数组[4,5,1,3]的第一个元素4,作为该小数组的初始最大值。 - 你理解的「外层for循环中i会和数值4做对比」是错误的:外层i循环的作用是遍历外层的每一个小数组,每次循环对应处理一个小数组求最大值,i本身是数组下标,不会直接和数组元素对比。
- 内层j循环的作用:遍历当前正在处理的小数组的所有元素,逐个和初始最大值对比,找到该小数组的真正最大值。
逐行代码说明
原始数据定义
const myArr = [ [4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1] ];
定义二维数组myArr,包含4个待处理的小数组,是函数的入参数据源。
函数定义
function largestOfFour(arr) {
定义名为largestOfFour的函数,接收二维数组参数arr,返回值为每个小数组最大值组成的新数组。
let results = [];
初始化空数组results,用来存储每个小数组的最大值,也就是你理解的结果存储容器。
for (let i = 0; i < arr.length; i++) {
外层for循环,遍历外层数组的所有小数组:
i从0开始每次加1,直到等于外层数组长度时停止,此处arr.length为4,对应4个小数组,每次i的值代表当前处理的是第几个小数组。
let largestNumber = arr[i][0];
给当前处理的小数组设置初始最大值,值为该小数组的第一个元素。比如i=0时,largestNumber初始值就是第一个小数组的第一个元素4。
for (let j = 1; j < arr[i].length; j++) {
内层for循环,遍历当前小数组的元素:
因为第一个元素已经被设为初始最大值,所以j从1开始(对应第二个元素),每次加1直到等于当前小数组的长度时停止,此处每个小数组长度为4,所以j会取1、2、3三个值。
if (arr[i][j] > largestNumber) { largestNumber = arr[i][j]; }
对比更新逻辑:把当前遍历到的小数组元素arr[i][j]和记录的最大值largestNumber对比,如果当前元素更大,就把最大值更新为当前元素。
比如i=0、j=1时,arr[0][1]是5,比初始最大值4大,所以largestNumber更新为5;后续遍历到的1、3都比5小,不需要更新,所以第一个小数组的最大值最终为5。
results[i] = largestNumber;
当前小数组遍历完成后,把得到的最大值存入结果数组results的第i位,和外层小数组的顺序保持一致。
} return results; }
所有小数组处理完成后,返回存储了所有最大值的results数组。
执行输出
console.log(largestOfFour(myArr));
调用largestOfFour函数,传入定义好的myArr,把返回的结果打印到控制台,最终输出为[5, 27, 39, 1001]。
内容的提问来源于stack exchange,提问作者Sherlok

