Сокращение для цикла в coffeescript
Я знаю, как делать инкремент для цикла в coffeescript, например:
CoffeeScript:
for some in something
Созданный Javascript:
for (_i = 0, _len = something.length; _i < _len; _i++)
Как создать цикл сокращения для цикла, подобный этому в Coffeescript?
for (var i = something.length-1; i >= 0; i--)
Ответы
Ответ 1
EDIT: поддерживается синтаксис CoffeeScript 1.5 by -1
.
Сначала вы должны ознакомиться с ключевым словом by
, который позволяет указать шаг. Во-вторых, вы должны понимать, что компилятор CoffeeScript использует очень наивный подход к конечным точкам цикла (см. issue 1187, с которым связан Blender), что означает что
for some in something by -1 # don't do this!!!
приведет к бесконечному циклу - он начинается с индекса 0, увеличивает индекс на -1, а затем ждет, пока индекс не достигнет something.length
. Вздох.
Итак, вместо этого вам нужно использовать синтаксис цикла диапазона, который позволяет сами определять конечные точки, но также означает, что вы должны сами захватить элементы цикла:
for i in [something.length - 1..0] by -1
some = something[i]
Очевидно, что это довольно грязно. Таким образом, вы должны строго рассмотреть итерацию поверх something.reverse()
. Просто помните, что reverse()
изменяет массив, на который вы его называете! Если вы хотите сохранить массив, но прокрутите его назад, его необходимо скопировать:
for some in something.slice(0).reverse()
Ответ 2
Что касается кофе script 1.5.0, это поддерживается:
for item in list by -1
console.log item
Это будет переведено на
var item, _i;
for (_i = list.length - 1; _i >= 0; _i += -1) {
item = list[_i];
console.log(item);
}
Ответ 3
Другое занятие только для записи:
i = something.length
while item = something[--i]
#use item
(будет ломаться по значениям ложности)
Ответ 4
Кажется, нет элегантного способа обратного преобразования.
Я проверил билет GitHub по этому поводу, но он был закрыт: https://github.com/jashkenas/coffee-script/issues/1187
Ранее использовался синтаксис:
for some in something by -1
Но он был удален в последних версиях.
EDIT: теперь он работает (для версии 1.6.2 @time).
Ответ 5
Идиоматический путь (из docs) в соответствии с:
lst = ['a', 'b', 'c']
for n in (num for num in [lst.length-1..0])
alert lst[n]
(Отредактировано после примечания @Trevor)
Edit:
Хотя, если производительность критическая, этот эквивалентный, но, возможно, менее эстетичный фрагмент будет генерировать менее результирующий javascript:
lst = [1,2,3]
i = lst.length
alert lst[i] while i--
Ответ 6
Для декрементов, основанных на индексах для циклов, вы можете использовать:
for i in [0...something.length].reverse()
Это устраняет беспорядок, о котором упоминается @TrevorBurnham, является проблемой с указанием самих конечных точек.
Если something.length
- 0
, это эквивалентно
for i in []