1

So I've been fighting with this a few hours now- the goal is to create a new array of the highest numbers in each array of 4. However, I can't seem to get it to loop more than once. How am I screwing up this for loop?

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

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

1
  • Your snippet does not work at all allTop.push is not a function.
    – takendarkk
    Commented Mar 28, 2018 at 21:02

4 Answers 4

3

The variable allTop should be defined before the loop as an array, and returned after the loop ends:

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

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

1
  • Ahhhhhh a scope problem. Mostly. Thank you!
    – chauxvive
    Commented Mar 28, 2018 at 20:30
3

A better approach is using the function map along with the function Math.max

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

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

Full ES6:

var largestOfFour = (arr) => arr.map(a => Math.max(...a));
var result = largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
console.log(result);

1
  • This is very similar to the other approach I was trying- thank you for demonstrating how Math.max and map can work together
    – chauxvive
    Commented Mar 28, 2018 at 20:29
2

Try this:

function largestOfFour(arr) {
  let allTop = [];
  arr.forEach(a => {
    allTop.push(Math.max.apply(Math, a));
  });
  return allTop;
}

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

Other solution would be to use function reduce along with the function Math.max

function largestOfFour(arr) {
  return arr.reduce((a, x) => {
    a.push(Math.max.apply(null,x));
    return a;
  }, []);
}

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.