从没有math.max的嵌套数组中返回最大数

时间:2018-12-12 19:50:21

标签: javascript arrays for-loop if-statement

我正在尝试将每个子数组中最大的数字返回到新数组。我感觉自己真的很近,感觉if(temp[j] < x) {continue;}不合适。我究竟做错了什么?附言我知道我可能可以只使用math.max()并保存很多代码,但是我想让自己熟悉for循环和数组。

  function largestOfFour(arr) {
  let newArr = [];

  for(let i = 0; i < arr.length; i++) {
    let temp = arr[i];
    let counter = 0;
    for(let j = 0; j < temp.length; j++) {
      let x = 0;
      if(temp[j] > counter) {
      counter = temp[j];
      if(counter > x) {
        x = counter;
        if(temp[j] < x) {
          continue;
        }
      }
      newArr.push(temp[j]);

      }

    }
    console.log(arr[i])
  }
  console.log(newArr);
}

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

4 个答案:

答案 0 :(得分:2)

您期望输出[5, 27, 39, 1001]吗?

如果是这样,对您的内循环进行的这些较小调整即可完成工作:

function largestOfFour(arr) {
    let newArr = [];

    for(let i = 0; i < arr.length; i++) {
        let temp = arr[i];
        let x = 0;
        for(let j = 0; j < temp.length; j++) {

            if(temp[j] > x) {
                x = temp[j];
            }
        }

        newArr.push(x);
        //console.log(arr[i])
    }
    console.log(newArr);
}

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

您在正确的轨道上,但是您要避免将子数组的最大值推到newArr上,直到内部循环完成对该子数组的迭代为止。在完成迭代之前,您不知道哪个值是子数组的最高值。

答案 1 :(得分:2)

@Elliot B.的答案可能就是您在寻找哪里出了问题的解释。

在数组上使用Map / Reduce的替代解决方案

解决方案来自https://medium.freecodecamp.org/three-ways-to-return-largest-numbers-in-arrays-in-javascript-5d977baa80a1

function largestOfFour(mainArray) {
  return mainArray.map(function (subArray){
    return subArray.reduce(function (previousLargestNumber, currentLargestNumber) {
      return (currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber;
    }, 0);
  });
}
//largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);


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

console.log(result);

答案 2 :(得分:1)

在代码中,您需要在内部循环中获取最大的数字,然后将其推送:

function largestOfFour(arr) {
  let newArr = [];

  for (let i = 0; i < arr.length; i++) {
    let temp = arr[i];
    let res = -Infinity; // initialize the res with lowest number
    for (let j = 0; j < temp.length; j++) {
      if (temp[j] > res) { // if a number is greater than res, assign it to res
        res = temp[j];
      }
    }
    newArr.push(res); // push res to the result arr
  }
  return newArr;
}

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

console.log(result);

如果将最大逻辑重构为外部函数会更容易:

const getArrayMax = ([first, ...arr]) => {
  let mx = first;
  
  for (const cur of arr)
    if (cur > mx)
      mx = cur;
  
  return mx;
}

function largestOfSubarrays(arr) {
  const newArr = [];

  for (let i = 0; i < arr.length; i++) {
    newArr.push(getArrayMax(arr[i])); // push res to the result arr
  }
  
  return newArr;
}

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

console.log(result);

答案 3 :(得分:0)

您还可以简单地按desc的顺序对数组进行排序并获得第一个元素:

const largestOfFour = arr => arr.map(x => x.sort((a,b) => b-a)[0])

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