Подтвердить что ты не робот

Сокращение для цикла в 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--)
4b9b3361

Ответ 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 []