while infinito for ejemplos ejemplo condicion ciclo bucle array javascript functional-programming ecmascript-6 ecmascript-harmony

javascript - infinito - forma funcional de iterar sobre el rango(ES6/7)



do while javascript ejemplo (3)

Propuesta ES7

Advertencia: Desafortunadamente, creo que las plataformas más populares han dejado de admitir la comprensión. Vea a continuación el método ES6 bien soportado

Siempre puedes usar algo como:

[for (i of Array(7).keys()) i*i];

Ejecutando este código en Firefox:

[0, 1, 4, 9, 16, 25, 36]

Esto funciona en Firefox (era una característica propuesta de ES7), pero se ha eliminado de la especificación. IIRC, Babel 5 con "experimental" habilitado lo admite.

Esta es su mejor opción, ya que la comprensión de matriz se usa solo para este propósito. Incluso puede escribir una función de rango para acompañar esto:

var range = (u, l = 0) => [ for( i of Array(u - l).keys() ) i + l ]

Entonces puedes hacer:

[for (i of range(5)) i*i] // 0, 1, 4, 9, 16, 25 [for (i of range(5,3)) i*i] // 9, 16, 25

ES6

Una buena manera de hacer esto:

[...Array(7).keys()].map(i => i * i); Array(7).fill().map((_,i) => i*i); [...Array(7)].map((_,i) => i*i);

Esto generará:

[0, 1, 4, 9, 16, 25, 36]

¿Cuál es la mejor manera de hacer lo siguiente de una manera más funcional (con ES6 / ES7)

let cols = []; for (let i =0; i <= 7; i++) { cols.push(i * i); } return cols;

Lo intenté como

return [ ...7 ].map(i => { return i * i; });

pero eso se tradujo en

[].concat(7).map(function (n) { return n * n; });

que no es lo que esperaba

EDITAR:

@pavlo. De hecho, eso fue un error. Estaba usando JSX, y por ejemplo, quiero 7 divs, (sin probar)

let cols = []; for (let i =0; i <= 7; i++) { cols.push(<div id={i}> ... </div>) } return cols;

Por lo tanto, la idea era reducir el número de variables temporales y la sensación de procedimiento.


Aquí hay un enfoque usando generadores:

function* square(n) { for (var i = 0; i < n; i++ ) yield i*i; }

Entonces puedes escribir

console.log(...square(7));

Otra idea es:

[...Array(5)].map((_, i) => i*i)

Array(5) crea una matriz de cinco elementos sin llenar. Así es como funciona Array cuando se le da un único argumento. Usamos el operador de propagación para crear una matriz con cinco elementos indefinidos. Que luego podemos mapear. Ver http://ariya.ofilabs.com/2013/07/sequences-using-javascript-array.html .

Alternativamente, podríamos escribir

Array.from(Array(5)).map((_, i) => i*i)

o podríamos aprovechar el segundo argumento de Array#from para omitir el map y escribir

Array.from(Array(5), (_, i) => i*i)

Un truco horrible que vi recientemente, que no recomiendo que uses, es

[...1e4+''''].map((_, i) => i*i)


Se puede crear una matriz vacía, llenarla (de lo contrario, el mapa lo omitirá) y luego asignar índices a valores:

Array(8).fill().map((_, i) => i * i);