chauxvive
chauxvive

Reputation: 230

Javascript looping through arrays of arrays

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]]);

Upvotes: 1

Views: 74

Answers (4)

yajiv
yajiv

Reputation: 2941

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]]));

Upvotes: 1

E. Celis
E. Celis

Reputation: 727

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]])
);

Upvotes: 2

Ele
Ele

Reputation: 33736

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);

Upvotes: 3

Ori Drori
Ori Drori

Reputation: 193002

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]]));

Upvotes: 3

Related Questions