返回数组中的最大数字

时间:2017-10-18 16:46:53

标签: javascript arrays sorting

我试图找到一组数组中的最大数字并将它们返回到新数组中。但我不知道为什么我的代码不起作用。你能解释我的错误吗?

function largestOfFour(arr) {
  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < arr[i].length; j++) {
      arr[i].sort(function(a, b) {
        return b - a;
      });

    }
  }
}

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

4 个答案:

答案 0 :(得分:0)

如果您希望从所有阵列中获取最大的 n 值,您可以展平列表,排序和消息。

var arrayOfArrys = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];
var flattened = [];

for (var _i = 0, arrayOfArrys_1 = arrayOfArrys; _i < arrayOfArrys_1.length; _i++) {
    var arr = arrayOfArrys_1[_i];
    flattened = flattened.concat(arr);
}

var sorted = flattened.sort(function (a, b) {
    return b - a;
});

alert(JSON.stringify(sorted));

答案 1 :(得分:0)

如果你正在寻找具有最大SUM的数组(因为你说你想要最大的&#34;数字&#34;不是&#34;数字&#34;),你可以做类似的事情:

function largestOfFour(arr) {
  var sums = [];
  for(var i = 0; i < arr.length; i++){
      var arraySum = 0;
      for(var j = 0; j < arr[i].length; j++){
        arraySum+=arr[i][j];
      }
      sums.push({array: arr[i], sum: arraySum});
   }
   return sums.sort(function(a,b){return b.sum - a.sum})[0].array;
}

答案 2 :(得分:0)

获得基本功能的第一轮重构涉及使用map来提取最大值:

map

第二次传递涉及更积极地使用max以及使用sort代替function largestOfFour(arr) { return arr.map(function(a) { return Math.max.apply(null, a); }); }

sort(function(a,b) { ... })

这样可以解决进行数字排序所需的丑陋data.frames垃圾。

答案 3 :(得分:0)

您的代码存在很多问题。

  • 当你循环遍历它们时,你正在对内部数组进行排序,这意味着对于一个大小为n的数组,你要对该数组n进行排序。这不必要地效率低下。
  • 如果您只想要max / min元素,那么排序效率很低;排序通常是 O(n log n)操作,但只是循环遍历数组 O(n)(有关详细信息,请参阅Big O notation)。
  • 虽然你的代码正在对内部数组进行排序,但你没有对结果做任何事情(即排序内部数组的第一个元素)。
  • 您没有从函数返回任何内容或修改输入数组以包含结果(如果意图是将'数组'就地'修改为返回值)。

解决这些问题:

function largestOfFour(arr) {
  var result = [], max, jMax;
  for (var i = 0; i < arr.length; i++) {
    max = arr[i][0];
    for (var j = 1; j < arr[i].length; j++) {
      if (max < arr[i][j])
        max = arr[i][j];
    }
    result.push(max);
  }
  
  return result;
}

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

或者更干净地使用mapreduce方法:

function largestOfFour(arr) {
  return arr.map(function(x) {
    return x.reduce(function(a, c) {
      return c < a ? a : c;
    });
  });
}


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