loops - Decrementando para loop en coffeescript
for-loop (6)
A partir de coffee-script 1.5.0 esto es compatible:
for item in list by -1
console.log item
Esto se traducirá en
var item, _i;
for (_i = list.length - 1; _i >= 0; _i += -1) {
item = list[_i];
console.log(item);
}
Sé cómo hacer un ciclo incrementing en coffeescript como:
Coffeescript:
for some in something
Javascript generado:
for (_i = 0, _len = something.length; _i < _len; _i++)
¿Cómo creo un ciclo de decremento para similar a esto en Coffeescript?
for (var i = something.length-1; i >= 0; i--)
Manera idiomática (de docs ) a lo largo de las líneas de:
lst = [''a'', ''b'', ''c'']
for n in (num for num in [lst.length-1..0])
alert lst[n]
(Editado después de la nota de @ Trevor)
Editar:
Aunque, si el rendimiento es crítico, este fragmento equivalente pero quizás menos estético generará menos javascript resultante:
lst = [1,2,3]
i = lst.length
alert lst[i] while i--
No parece haber una forma elegante de realizar un ciclo en reversa.
Revisé el ticket de GitHub con respecto a esto, pero se ha cerrado: https://github.com/jashkenas/coffee-script/issues/1187
La sintaxis solía ser:
for some in something by -1
Pero ha sido eliminado en versiones recientes. EDITAR: funciona ahora (para 1.6.2 @time of edit)
Para un decrecimiento, basado en índices para bucles, puede usar:
for i in [0...something.length].reverse()
Esto elimina el desorden que el @TrevorBurnham mencionado es un problema con la especificación de los puntos finales usted mismo.
Cuando something.length
es 0
, esto es equivalente a
for i in []
Una toma diferente solo para el registro:
i = something.length
while item = something[--i]
#use item
(romperá con los valores falsy)
EDITAR: desde CoffeeScript 1.5 by -1
sintaxis es compatible.
En primer lugar, debe familiarizarse con la palabra clave by
, que le permite especificar un paso. En segundo lugar, debe comprender que el compilador de CoffeeScript adopta un enfoque muy ingenuo para los puntos finales de bucle (consulte el número 1187 , al que Blender se vincula), lo que significa que
for some in something by -1 # don''t do this!!!
dará como resultado un bucle infinito: comienza en el índice 0, incrementa el índice en -1 y luego espera hasta que el índice llegue a something.length
. Suspiro.
Por lo tanto, debe usar la sintaxis de bucle de rango, que le permite especificar esos puntos finales usted mismo, pero también significa que debe agarrar los elementos de bucle por su cuenta:
for i in [something.length - 1..0] by -1
some = something[i]
Obviamente eso es bastante desordenado. Por lo tanto, debe considerar iterar sobre algo.reverse something.reverse()
lugar. ¡Solo recuerda que reverse()
modifica la matriz en la que lo llamas! Si desea conservar una matriz pero repetirla hacia atrás, debe copiarla:
for some in something.slice(0).reverse()