Estoy tratando de ejecutar una función de reducción en una matriz de matrices. Las matrices dentro de la matriz pueden estar vacías. Entonces: [[], [], [], []]. Reduce ((x, y) => x.length + y.length) no funciona

[[2, 3], [2, 3], [3, 5], [5, 6]]. Reducir ((x, y) => x.length + y.length) tampoco parece funcionar ?

¿Me estoy perdiendo algo?

0
DeanR 31 oct. 2017 a las 13:54

3 respuestas

La mejor respuesta

La firma de la función que pasa como primer argumento para .reduce es

(accumulator, currentValue, currentIndex, array) => {...}

El segundo argumento que puede pasar a reduce es el valor inicial para el acumulador.

En su caso, (x, y) => x.length + y.length está tratando de obtener el length del acumulador, llamado x, que será undefined, y agregarlo al length de la primera matriz en la matriz principal.

Cuando intentas agregar undefined a un número, obtienes NaN.

Supongo que está tratando de calcular la longitud total de todas las matrices en su matriz principal. Si es así, prueba esto ...

[[],[],[],[]].reduce((acc, array) => acc + array.length, 0)
// returns 0

[[2, 3], [2, 3], [3, 5], [5, 6]].reduce((acc, array) => acc + array.length, 0)
// returns 8
2
Marc Davies 31 oct. 2017 a las 11:02

Podría tomar un valor inicial para {{X0 }}.

var getLength = (r, x) => r + x.length,
    length0 = [[], [], [], []].reduce(getLength, 0),
    //                                           ^
    length1 = [[2, 3], [2, 3], [3, 5], [5, 6]].reduce(getLength, 0);
    //                                                           ^

console.log(length0);
console.log(length1);
1
Nina Scholz 31 oct. 2017 a las 10:58

Tenga cuidado porque x.length e y.length eventualmente se convertirán en enteros y los enteros no tienen una propiedad de longitud.

Puedes hacer algo como

(x, y) => x.length || x + y.length || y

De modo que si x.length existe, se usa, de lo contrario solo use el valor de x

1
Luca De Nardi 31 oct. 2017 a las 10:58