获取多维数组的最大值

时间:2015-12-03 20:04:18

标签: javascript arrays loops

我正在尝试查找多维数组的最大值。

输入:

[[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]

结果:

[5, 27, 39, 1001]

我尝试了什么:

var largestArr = [];

function largestOfFour(arr) {
  for (var i = 0; i < arr.length; i++) {
    var largest = 0;
    var currentArr = arr[i];
    var stop = currentArr.length;
    for (var j = 0; j < stop; j++) {
      if (currentArr[0] > largest) {
        largest = currentArr[0];
        largestArr.push(largest);
        largestArr.shift();
      }
    }

    return largestArr;
  }
}

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

任何人都可以帮助我理解为什么这不起作用吗?

3 个答案:

答案 0 :(得分:1)

问题出在这里

if (currentArr[0]>largest){
   largest = currentArr[0];
   //
}

这应该如下所示:

if (currentArr[j]>largest){
    largest = currentArr[j];
    // 
}
  

为什么这是错的?

这是错误的,因为你总是将每个数组的第一项与largest进行比较,而不是逐个比较每个数组中的所有项目。

此外,您还需要进行一些更正。

Specifficaly,没有必要使用shift方法。您只需在largestArr中的每个处理结束后推送每个数组的最大值。最后,但并非最不重要的是,您必须将largestArr的return语句移出for循环。

&#13;
&#13;
var largestArr = [];

function largestOfFour(arr) {
  for (var i=0; i<arr.length; i++) {
    var largest = 0;
    var currentArr = arr[i];
    var stop = currentArr.length;
    for (var j=0; j<stop; j++){
      if (currentArr[j]>largest){
        largest = currentArr[j];
      }
    }
    largestArr.push(largest); 
  }
  return largestArr;
}

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

答案 1 :(得分:0)

由于此处提供了答案,因此某些代码可以在较少的行中执行相同的工作,以后您可能会发现使用reduce有用。

var out = arr.reduce(function (p, c) {
  return p.concat(Math.max.apply(null, c));
}, []);

DEMO

答案 2 :(得分:0)

的Christos&#39;答案是正确的,应该选择作为答案。

此外,您不应该通过在函数外部声明largestArray来污染全局命名空间,因为无论如何您都要返回所述数组。

function largestOfFour(arr) {
    var largestArr = [];       // put this line here instead of making it global
    for (var i=0; i<arr.length; i++) {
        var largest = 0;
        var currentArr = arr[i];
        var stop = currentArr.length;
        for (var j=0; j<stop; j++){
            if (currentArr[j]>largest){
                largest = currentArr[0]; 
            }
        }
        largestArr.push(largest);
    }
    return largestArr;
}

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