Памяншэнне нумары для завесы ў 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--)
26

6 адказы

<�Моцны> Рэдагаваць :. Па CoffeeScript 1.5 на -1 сінтаксіс падтрымліваецца </моцны>

Па-першае, вы павінны азнаёміцца ​​з па ключавое слова, якое дазваляе задаць крок. Па-другое, вы павінны разумець, што кампілятар CoffeeScript займае вельмі наіўны падыход да канчатковым кропках контуру (гл пытанне 1187 , які звязаны з блендер), што азначае, што

for some in something by -1 # don't do this!!!

прывядзе да бясконцай завесы-яна пачынаецца з індэкса 0, прырашчэнне індэкса на -1, і затым чакае, пакуль хітоў індэкса something.length . Ўздых.

Такім чынам, вы павінны выкарыстоўваць сінтаксіс цыклу дыяпазон замест, які дазваляе вызначыць тыя канчатковыя кропкі самастойна, але таксама азначае, што вы павінны захапіць рэчы LOOP сябе:

for i in [something.length - 1..0] by -1
  some = something[i]

Відавочна, што гэта даволі брудна. Такім чынам, вы павінны сур'ёзна разгледзець пытанне аб ітэрацыя something.reverse() замест гэтага. Проста памятаеце, што зваротны() змяняе масіў, які вы называеце яго! Калі вы хочаце захаваць масіў, але ітэрацыю па ёй у адваротным кірунку, вы павінны скапіяваць яго:

for some in something.slice(0).reverse()
50
дададзена
+1 для .slice (0) .reverse() , толькі тое, што я шукаў!
дададзена аўтар Dan Abramov, крыніца
@RicardoTomasi Вы маеце рацыю, што ён будзе працаваць без па -1 , але гэта менш эфектыўны, погляд на скампіляваны выхад для абодвух. З пункту гледжання кампілятара, something.length з'яўляецца патэнцыйна негатыўным, так што крок патэнцыйна альбо 1 або -1 .
дададзена аўтар Trevor Burnham, крыніца
@davidchambers Праўда, па стане на CoffeeScript 1.3.1.
дададзена аўтар Trevor Burnham, крыніца
Звярніце ўвагу, што масіў [..] гэта скарачэнне для array.slice (0) .
дададзена аўтар davidchambers, крыніца
Я думаю, што вы нават не трэба -1 . <�Код> для г у [sth.length-1..0] працуе выдатна
дададзена аўтар Ricardo Tomasi, крыніца
@Robert добры ўлоў. <�Код> для г у [sth.length-1 ...- 1] "выпраўленняў", што: D
дададзена аўтар Ricardo Tomasi, крыніца
@RicardoTomasi Вам патрэбен па -1 , калі STH гэта пусты масіў. У адваротным выпадку цыкл будзе працаваць у два разы больш, чым чакалася (нуль раз). Пасля таго, як для -1 і адзін раз для 0 .
дададзена аўтар Robert, крыніца

Як кава-скрыпт 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);
}
38
дададзена
Вы таксама можаце выкарыстоўваць элемент, індэкс сінтаксіс з гэтым, як: console.log «# {item.toString ()} па індэксе # {індэкс}» для пункта, індэкс ў спісе, - 1
дададзена аўтар glampr, крыніца

Іншыя бярэм толькі для запісу:

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

(Зламаў на falsy значэнняў)

2
дададзена
гэта адзін не ламаецца пры выкарыстанні больш пустых масіваў
дададзена аўтар david, крыніца

Там, здаецца, не будзе элегантным спосабам завесы ў зваротным кірунку.

I checked the GitHub ticket regarding this, but it has been closed: https://github.com/jashkenas/coffee-script/issues/1187

Сінтаксіс, які выкарыстоўваецца, каб быць:

for some in something by -1

Але яна была выдаленая ў апошніх версіях. EDIT: ён працуе цяпер (для 1.6.2 @time ад рэдагавання)

1
дададзена

Ідыёматычны шлях (з дакументы ) уздоўж ліній:

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--
0
дададзена
Гм, гэта працуе толькі, калі LST гэта [1,2,3] . Калі вы спрабуеце, напрыклад, LST = [ 'A', 'B', 'C'] , выхад ўсё роўна будзе 3 , 2 </код >, 1 .
дададзена аўтар Trevor Burnham, крыніца
Права, фіксаваны код. Другая версія дакладная, хоць.
дададзена аўтар Jacob Oscarson, крыніца

Для паменшвалага, на аснове індэксаў для завес, вы можаце выкарыстаць:

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

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

Калі something.length гэта 0 , гэта эквівалентна

for i in []
0
дададзена