I know how to do a incrementing for loop in coffeescript such as:
Coffeescript:
for some in something
Generated Javascript:
for (_i = 0, _len = something.length; _i < _len; _i++)
How do I create a decrementing for loop similar to this in Coffeescript?
for (var i = something.length-1; i >= 0; i--)
There doesn't seem to be an elegant way to loop in reverse.
I checked the GitHub ticket regarding this, but it has been closed: https://github.com/jashkenas/coffee-script/issues/1187
The syntax used to be:
But it has been removed in recent versions. EDIT: it works now (for 1.6.2 @time of edit)
Idiomatic way (from docs) along the lines of:
(Edited after @Trevor's note)
Edit:
Although, if performance is critical, this equivalent but maybe less aesthetic snippet will generate less resulting javascript:
A different take just for the record:
(will break on falsy values)
EDIT: As of CoffeeScript 1.5
by -1
syntax is supported.First, you should familiarize yourself with the
by
keyword, which lets you specify a step. Second, you have to understand that the CoffeeScript compiler takes a very naïve approach to loop endpoints (see issue 1187, which Blender linked to), which means thatwill result in an infinite loop—it starts at index 0, increments the index by -1, and then waits until the index hits
something.length
. Sigh.So you need to use the range loop syntax instead, which lets you specify those endpoints yourself—but also means you have to grab the loop items yourself:
Obviously that's pretty messy. So you should strongly consider iterating over
something.reverse()
instead. Just remember thatreverse()
modifies the array that you call it on! If you want to preserve an array but iterate over it backwards, you should copy it:For a decrementing, index-based for loops, you can use:
This removes the messiness @TrevorBurnham mentioned is an issue with specifying endpoints yourself.
When
something.length
is0
, this is equivalent toAs of coffee-script 1.5.0 this is supported:
This will translate into