La línea de código en cuestión:
let largest = arr.reduce((a,v,i) => v > a[1] ? [i,v] : a, [-1,0]); Estoy confundido principalmente por esta parte a, [-1,0] , no entiendo esta sintaxis. ¿Qué es a hacer antes de una coma?
const reducer = (accumulator, currentValue, index) => { if (currentValue > accumulator[1]) { return([index, currentValue]) } else { return(accumulator) } } let largest = accumulator.reduce(reducer, [-1, 0]) Array.prototype.reduce() tiene dos argumentos, la función de devolución de llamada y el valor inicial. De ahí viene el [-1, 0] , ese es el "valor inicial" que se pasará como el "acumulador" a la función de devolución de llamada en la primera iteración.
La abreviatura más corta para una función en javascript es () => value donde "valor" representa el valor de retorno de la función; no se requieren paréntesis. En este ejemplo, ese valor de retorno es una declaración ternaria: condition ? return if true : return if false . Esencialmente, debido a que están usando una sola línea para producir un solo valor, no se requieren paréntesis ni llaves alrededor de la función (que termina en a ).
La función de devolución de llamada que pasa a Array.reduce() puede tomar tres argumentos (accumulator, currentValue, index) .
La clave aquí está en el valor inicial, que es [index, value] , que realiza un seguimiento de ambos hasta que finaliza la iteración, en cuyo caso solo se devuelve el valor final.
La matriz que viene después de la coma es un segundo argumento para .reduce() . El código allí es equivalente a
let largest = arr.reduce( (a,v,i) => { return v > a[1] ? [i,v] : a; }, [-1,0] // second argument ); En la iteración, el acumulador es una matriz compuesta por 2 valores. El valor devuelto por la devolución de llamada se convierte en el nuevo acumulador en la próxima iteración. El valor devuelto en la última iteración se convierte en el resultado de la expresión .reduce() completa: el largest .
Entonces, ¿qué return v > a[1] ? [i,v] : a; lo que hace dentro de una devolución de llamada .reduce() es que pasará por la matriz y encontrará el elemento con la v más alta; una vez que [i, v] de eso se convierte en el acumulador, el acumulador permanecerá como esa matriz hasta que finalice la iteración.
Esto se entiende más fácilmente si se formaliza y amplía:
let reducer = (a,v,i) => { if (v > a[1]) return [i,v]; return a }; let largest = arr.reduce(reducer, [-1,0]);Donde ahora el argumento de la función reductora es bastante claro.