Home > Mobile >  Counting arrays values in JavaScript
Counting arrays values in JavaScript

Time:05-27

I have to create a function that receives an array in which every element is a number, or it can be another array with numbers inside, for example : const array = [1, [2, [3,4]], [5,6], 7]; The function should count all the values and return it countArray(array); --> should return 28 because (1 2 3 4 5 6 7)

I tried this

const array = [1, [2, [3,4]], [5,6], 7];

var countArray = function(array) {
  let sum = 0
  for (let i = 0; i < array.length; i  ) {
    if (Array.isArray(array[i])) {
      countArray(array[i])
    }
    sum = sum   array[i]
  }
  return sum
}

console.log(countArray(array));

but this does not work, anybody knows why?

CodePudding user response:

Firstly you need to do single for incoming nested array.
You can use flat() method.

var nestedArray = [0, 1, 2, [3, 4]]; 
var flatArray = nestedArray.flat(Infinity); // [0,1,2,3,4];

Array.prototype.reduce can be used to iterate through the array,
adding the current element value to the sum of the previous element values

var totalSum = flatArray.reduce(function (accumulator, a) {
  return accumulator   a;
}, 0)

So,

    const array = [1, [2, [3,4]], [5,6], 7];
    
    var countArray = function(array) {
    
      var flatArray = array.flat(Infinity);
      var totalSum = flatArray.reduce(function (accumulator, a) {
        return accumulator   a;
      }, 0)
    
      return totalSum;
    }
    
    console.log(countArray(array))

CodePudding user response:

Two solutions. First is simply to modify these lines:

        if (Array.isArray(array[i])) {
            countArray(array[i])
        }
        sum= sum   array[i]

to these:

        if (Array.isArray(array[i])) {
            sum  = countArray(array[i])
        } else {
            sum  = array[i]
        }

or this:

        sum  = Array.isArray(array[i]) ? countArray(array[i]) : array[i]

Second solution:

const array = [1, [2, [3,4]], [5,6], 7]

countArray = array => array.flat(Infinity).reduce( (a, c) => a   c, 0 );

console.log(countArray(array))

The second solution depends on Array.prototype.flat, which is fairly (ECMA 2019) recent so support may not be 100%. There are other options, pretty good list here

CodePudding user response:

To spare you the effort of recursion here's a simple trick.

Ordinarily, on its own, flat will only flatten a series of nested arrays one level deep. If you supply Infinity as an argument you can flatten nested arrays n-level deep, and then you can reduce over those elements to get the sum.

const array = [1, [2, [3,4]], [5,6, [3, [23, [1, 2, [12]]]]], 7];

function countArray(arr) {
  return arr
    .flat(Infinity)
    .reduce((acc, c) => acc   c, 0);
}

console.log(countArray(array));

CodePudding user response:

Changing as little as possible about your code, you need add either the countArray of the item (if the item is an array) or the item itself (if it's not an array) to the sum.

const array = [1, [2, [3,4]], [5,6], 7];

var countArray = function(array) {
  let sum = 0
  for (let i = 0; i < array.length; i  ) {
    if (Array.isArray(array[i])) {
      sum = sum   countArray(array[i])
    } else {
      sum = sum   array[i]
    }
  }
  return sum
}

console.log(countArray(array));

CodePudding user response:

you can use flat(infinity) to have all the numbers in the array and then loop through each one to sum them up.

const array = [1, [2, [3, 4]], [5, 6], 7];

const fixedArray = array.flat(Infinity);

let sum = 0;
for (let index = 0; index < fixedArray.length; index  ) {
  sum  = fixedArray[index];
}

console.log("sum: ", sum);

  • Related