返回数组中的最大数字

时间:2017-11-08 14:59:36

标签: javascript arrays

我在FreeCodeCamp中正在努力完成这项任务,我不知道哪里出错了,为什么结果不是我所期待的。请帮帮我。谢谢!



<!DOCTYPE HTML>
<html>

<head>
  <script>
    function largestOfFour(arr) { //loop every inside array in the outside array.
      var data = []; //storing the output array
      for (var x = 0; x < arr.length; x++) {
        data[x] = largestOfSingle(arr[x]);
      }
      console.log(data); // the result should be [27,5,39,1000]
    }

    function largestOfSingle(myArr) { //find the largest element in every inside array.
      if (myArr.length == 1)
        return myArr[0];
      if (myArr[0] >= myArr[1])
        return largestOfSingle(myArr.splice(1, 1));
      if (myArr[0] < myArr[1])
        return largestOfSingle(myArr.slice(1, myArr.length));
    }
  </script>
</head>

<body onload="largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);">
  <!--two dimensional array-->
</body>
<html>
&#13;
&#13;
&#13;

6 个答案:

答案 0 :(得分:2)

使用Math.max()这将直接返回最高值。无需编写额外的功能就可以完全实现。

function largestOfFour(arr) { //loop every inside array in the outside array.
  var data = []; //storing the output array
  for (var x = 0; x < arr.length; x++) {
    data[x] = Math.max(...arr[x]);
  }
  console.log(data); // the result should be [27,5,39,1000]
}

编辑:修复OP解决方案

&#13;
&#13;
<!DOCTYPE HTML>
<html>

<head>
  <script>
    function largestOfFour(arr) { //loop every inside array in the outside array.
      var data = []; //storing the output array
      for (var x = 0; x < arr.length; x++) {
        data[x] = largestOfSingle(arr[x]);
      }
      console.log(data); // the result should be [27,5,39,1000]
    }

    function largestOfSingle(myArr) { //find the largest element in every inside array.
      if (myArr.length == 1)
        return myArr[0];
      if (myArr[0] >= myArr[1]) {
        myArr.splice(1, 1);
        return largestOfSingle(myArr);
      }
      if (myArr[0] < myArr[1])
        return largestOfSingle(myArr.slice(1, myArr.length));
    }
  </script>
</head>

<body onload="largestOfFour([[ 13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]);">
  <!--two dimensional array-->
</body>
<html>
&#13;
&#13;
&#13;

您会注意到我改变了您使用拼接的方式。你正在做的事情就是你使用了splice的返回值,而不是发送修改过的数组。

来自splice doc

  

返回值包含已删除元素的数组。如果只有一个   删除元素,返回一个元素的数组。如果不   删除元素,返回一个空数组。

答案 1 :(得分:2)

问题在于:

if (myArr[0] >= myArr[1])
  return largestOfSingle(myArr.splice(1, 1));

Splice返回拼接的东西,而不是原始数组。可以这样做:

if (myArr[0] >= myArr[1]){
  myArr.splice(1, 1)
  return largestOfSingle(myArr);
}

但在我看来,通过简单的逻辑可以真正简化:

var max = - Infinity;
for(var i = 0; i < myArr.length; i++)
  if(myArr[i] > max) max = myArr[i];
return max;

答案 2 :(得分:1)

如果使用递归不是强制性的,你也可以用几行来完成:

myArr.sort(function(a, b){return b - a});
myArr.reverse();
return myArr[0];

答案 3 :(得分:1)

Array.splice()会返回已删除的项,而不是已修改的数组。相反,您需要在将原始数组传递到递归largestOfSingle()之前将其拼接,如下所示:

function largestOfSingle(myArr) { //find the largest element in every inside array.
  if (myArr.length == 1)
    return myArr[0];
  if (myArr[0] >= myArr[1])
    myArr.splice(1, 1); // splice first
  return largestOfSingle(myArr); // pass in modified array
  if (myArr[0] < myArr[1])
    return largestOfSingle(myArr.slice(1, myArr.length));
}

答案 4 :(得分:0)

蛮力解决方案是手动迭代:

document.addEventListener('error', (e) => {
  // do your magic here
}, true)

另一种解决方案,如果允许使用function largestOfFour(arr) { var largest = [0,0,0,0]; // an array to hold the final result // brute force all arrays for(var i = 0; i < arr.length; i++) { // iterate through sub arrays for(var j = 0; j < arr[i].length; j++) { if(arr[i][j] > largest[i]) { // overwrite old stored largest if the subarray is larger largest[i] = arr[i][j]; } } } return largest; }

Math

可以使用function largestOfFour(arr) { return arr.map(function(subArr) { return Math.max.apply(null, subArr); }); } 的第三种解决方案

reduce

答案 5 :(得分:0)

问题只是您在此行中意外写了slice而不是splice

    return largestOfSingle(myArr.slice(1, myArr.length));