Tengo que crear una función que reciba una matriz en la que cada elemento sea un número, o puede ser otra matriz con números dentro, por ejemplo: const matriz = [1, [2, [3,4]], [5, 6], 7]; La función debe contar todos los valores y devolverlos countArray(array); --> debería devolver 28 porque (1 + 2 + 3 + 4 + 5 + 6 + 7)
probé esto
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));pero esto no funciona, alguien sabe por qué?
En primer lugar, debe hacer solo para la matriz anidada entrante.
Puede usar el método flat() .
var nestedArray = [0, 1, 2, [3, 4]]; var flatArray = nestedArray.flat(Infinity); // [0,1,2,3,4]; Array.prototype.reduce se puede usar para iterar a través de la matriz,
sumando el valor del elemento actual a la suma de los valores de los elementos anteriores
var totalSum = flatArray.reduce(function (accumulator, a) { return accumulator + a; }, 0)Asi que,
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))Dos soluciones. Primero es simplemente modificar estas líneas:
if (Array.isArray(array[i])) { countArray(array[i]) } sum= sum + array[i]a estos:
if (Array.isArray(array[i])) { sum += countArray(array[i]) } else { sum += array[i] }o esto:
sum += Array.isArray(array[i]) ? countArray(array[i]) : array[i]Segunda solución:
const array = [1, [2, [3,4]], [5,6], 7] countArray = array => array.flat(Infinity).reduce( (a, c) => a + c, 0 ); console.log(countArray(array)) La segunda solución depende de Array.prototype.flat , que es bastante reciente (ECMA 2019), por lo que es posible que el soporte no sea del 100 %. Hay otras opciones, bastante buena lista aquí
Para ahorrarle el esfuerzo de la recursividad, aquí hay un truco simple.
Por lo general, por sí solo, flat solo aplanará una serie de arreglos anidados de un nivel de profundidad. Si proporciona Infinity como argumento, puede aplanar matrices anidadas de n niveles de profundidad y luego puede reduce esos elementos para obtener la suma.
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));