Lo que me gustaría hacer es que un cierre devuelva el mismo valor n
cantidad de veces.
let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3);
Entonces debería obtener:
value() // returns 0 value() // returns 0 value() // returns 0 value() // returns 315 value() // returns 315 value() // returns 315 value() // returns 270 value() // returns 270 value() // returns 270
¡Esto es lo que probé!
function getCurrentValue(values, num) { let index = -1; let l = values.length; function increment() { ++index; if (index < l) { return values[index] } else { index = -1; ++index; return values[index] } } if (num) { for (var i = 0; i < num; i++){ return increment } } return increment; }
¡Cualquier ayuda sería apreciada!
Aquí está mi solución de generator
y solución de cierre.
// generator solution function* getCurrentValueIter(iter, times) { for (let i = 0; i < iter.length * times; i++) { const cur = Math.floor(i / times); yield iter[cur] } } console.log('generate') const valueIter = getCurrentValueIter([0, 1], 2) for (let value of valueIter) { console.log(value) } // you can also use valueIter manually // console.log(valueIter.next().value) // closure solution function getCurrentValue(iter, times) { let i = 0 function value() { while (i < iter.length * times) { const cur = Math.floor(i / times); i += 1 return iter[cur] } } return value } const value = getCurrentValue([0, 1], 2) console.log('closure', value()) console.log(value()) console.log(value()) console.log(value())
Usando solo un cierre: realice un seguimiento del índice y la cantidad de repeticiones fuera de la función devuelta, para que los valores persistan a través de las llamadas:
function getCurrentValue(arr, n) { let index = 0; let repeat = 0; return function() { if (repeat < n) { repeat++; } else { repeat = 1; index++; } return arr[index]; } } let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3); console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }
La sección if
/ else
se puede acortar usando %
para aumentar el valor de repeat
y limitarlo al máximo:
function getCurrentValue(arr, n) { let index = -1; let repeat = -1; return function() { repeat = (repeat + 1) % n; if (repeat === 0) index++; return arr[index]; } } let value = getCurrentValue([0, 315, 270, 225, 180, 135, 90], 3); console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 0 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 315 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 270 console.log(value()); // returns 225
.as-console-wrapper { max-height: 100% !important; }