Hay una función simple, su esencia es contar desde un número (n) hasta 0. Pero cuando se usa reduce, la función simplemente no funciona, y no importa cómo la reescriba, devuelve una matriz vacía o indefinida , o el número en sí mismo 2. Primero, creé una matriz que tomará n, luego creé un método de reducción en el que currentValue tomará n y restará 1 de él, después del acumulador toma el número resultante y usando el método push, agregue a la matriz de la lista, pero no entiendo cómo debo agregar una condición de que si el acumulador es igual a 0, entonces la función debe detenerse.
const countBits = (n) => { let list = [n]; let resultReduce = n.reduce((accumulator, currentValue) => { accumulator = currentValue - 1; list.push(accumulator); }); return resultReduce; }; console.log(countBits([2]));¿Por qué esto no está funcionando de la manera que pretendía?
reduce se ejecutará en cada uno de los elementos de la matriz, siendo el accumulator (primer argumento de la función de devolución de llamada) el valor que se devuelve de la iteración anterior de la función de devolución de llamada. Entonces, si no devuelve nada, el accumulator no estará undefined para la próxima iteración.
Si desea contar de n a 0 , reduce no es el camino a seguir (así como el hecho de que en su implementación actual, ni siquiera usa la list que contendría todos sus números almacenados de n a 0 ). Aconsejaría que, en su lugar, simplemente haga un bucle de n a 0 e inserte esos valores en una matriz como esta:
const countBits = (n) => { let list = []; for (let i = n; i > -1; i--) { list.push(i); } return list; }; console.log(countBits(2));También tenga en cuenta que cambié ligeramente su sintaxis en la llamada a la función: estaba pasando una matriz con un solo elemento aparentemente innecesariamente, así que simplemente pasé el elemento para simplificar el código.
La respuesta de Jack Bashford es correcta, pero para completar me gustaría señalar que generar un rango de números es una necesidad común. Bibliotecas como Underscore , Lodash y Ramda proporcionan una función lista para usar para este propósito. No tiene que escribir su propia implementación cada vez que necesite algo común y mundano como eso; ahorre tiempo y disfrute del hecho de que puede dedicar su tiempo a algo más innovador.
console.log(_.range(2, -1, -1)); <script src="https://underscorejs.org/underscore-umd-min.js"></script> También en aras de la exhaustividad, consideremos cómo podría implementar una función de range descendente usando reduce , de todos modos. reduce espera una matriz de entrada, aunque también puede aceptar un objeto si usa Underscore o Lodash. Para hacer un uso significativo de la colección de entrada, podríamos generar un número consecutivo para cada elemento de la colección. Para una matriz, por supuesto, podríamos simplemente hacer _.range(collection.length - 1, -1, -1) en su lugar, pero para un objeto, o algo cuya longitud no sepa de antemano, como un generador, usar reduce para este propósito podría tener sentido. La siguiente función mapDownwardsRange hará esto:
function unshiftNext(array) { const front = array.length ? array[0] : -1; return [front + 1].concat(array); } function mapDownwardsRange(collection) { return _.reduce(collection, unshiftNext, []); } console.log(mapDownwardsRange(['a', 'b', 'c'])); <script src="https://underscorejs.org/underscore-umd-min.js"></script>