Уменьшение для цикла в coffeescript - PullRequest
28 голосов
/ 27 октября 2011

Я знаю, как сделать приращение для цикла в 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--)

Ответы [ 6 ]

52 голосов
/ 27 октября 2011

РЕДАКТИРОВАТЬ: Начиная с CoffeeScript 1.5 by -1 поддерживается синтаксис.

Во-первых, вы должны ознакомиться с ключевым словом by, которое позволяет вам указать шаг. Во-вторых, вы должны понимать, что компилятор CoffeeScript использует очень наивный подход к конечным точкам цикла (см. выпуск 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()
38 голосов
/ 01 апреля 2013

Начиная с кофе-скрипта 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);
}
2 голосов
/ 29 октября 2011

Другой дубль только для записи:

i = something.length
while item = something[--i]
  #use item

(сломается при ложных значениях)

1 голос
/ 27 октября 2011

Кажется, что нет элегантного способа циклического переворота.

Я проверил билет GitHub по этому поводу, но он был закрыт: https://github.com/jashkenas/coffee-script/issues/1187

Синтаксис:

for some in something by -1

Но он был удален в последних версиях. РЕДАКТИРОВАТЬ: это работает сейчас (для 1.6.2 @ время редактирования)

0 голосов
/ 04 февраля 2015

Для убывающих циклов на основе индекса вы можете использовать:

for i in [0...something.length].reverse()

Это устраняет беспорядок, упомянутый @TrevorBurnham, является проблемой с указанием конечных точек самостоятельно.

Когда something.length равно 0, это эквивалентно

for i in []
0 голосов
/ 27 октября 2011

Идиоматический способ (от документов ) по направлениям:

lst = ['a', 'b', 'c']
for n in (num for num in [lst.length-1..0])
  alert lst[n]

(Отредактировано после @ Тревора)

Edit:

Хотя, если производительность критична, этот эквивалентный, но, возможно, менее эстетичный фрагмент будет генерировать меньше результирующего JavaScript:

lst = [1,2,3]
i = lst.length
alert lst[i] while i--
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...