在JavaScript

时间:2015-09-17 17:17:14

标签: javascript arrays math max

我试图找到四个子阵列中每个子阵列中的最大数量,将每个max推送到包含所有四个maxes的新数组并返回该数组。当我运行此代码时,它返回一个包含四个值的数组,但它们都是null。我究竟做错了什么?

largest = [];

function largestOfFour(arr) {
  for (i = 0; arr.length > i; i++) {
    var tempSub = arr.slice(i , i + 1);
    largest.push(Math.max.apply(Math, tempSub));
  } 
  return largest;
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]], "");

2 个答案:

答案 0 :(得分:3)

您可以使用Array.map在每个获取其最大值的数组上运行函数:

function largestOfFour(arr) {
    return arr.map(function(v){
        return Math.max.apply(Math, v);
    });
}

或使用ES6 arrow functions(实际上支持的浏览器不多):

function largestOfFour(arr) {
    return arr.map(v => Math.max.apply(Math, v));
}

答案 1 :(得分:3)

当您使用slice获取数组的一部分时,您将获得一个包含其中项目的数组。变量tempSub不包含像[4, 5, 1, 3]这样的值数组,它包含一组值数组,如[[4, 5, 1, 3]]。当您将其发送到max方法时,它将无法获得最大值,因为您没有将值发送到方法中,而是发送一个数组值。

使用arr[i]获取数组中的项而不是slice

此外,您应该在函数内部声明变量largest,以便可以多次使用该函数而不保留先前调用的结果。变量i也应该是本地的。

function largestOfFour(arr) {
  var largest = [];
  for (var i = 0; i < arr.length; i++) {
    largest.push(Math.max.apply(Math, arr[i]));
  } 
  return largest;
}

var result = largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

// show result in snippet
document.write(JSON.stringify(result));