Кофейнстегі цикл үшін азайту

Мен кофе индекстерінде циклді ұлғайтуды қалай білетінін білемін:

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 жауаптар

EDIT: КофеScript 1.5 бойынша -1 синтаксисіне қолдау көрсетіледі.

Біріншіден, қадамды көрсетуге мүмкіндік беретін бойынша кілт сөзімен танысыңыз. Екіншіден, 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()
50
қосылды
+1 үшін .slice (0) .reverse() , тек іздегенім!
қосылды автор Dan Abramov, көзі
@RicardoTomasi Сіз бойынша -1 жоқ жұмыс істейтіндігіңіз дұрыс, бірақ ол тиімдірек, екеуіне де шығарылған нәтижеге қараңыз. Компилятор тұрғысынан something.length ықтимал теріс, сондықтан бұл қадам 1 немесе -1 .
қосылды автор Trevor Burnham, көзі
@davidchambers True, CoffeeScript 1.3.1 сияқты.
қосылды автор Trevor Burnham, көзі
array [..] - array.slice (0) үшін стенография екенін ескеріңіз.
қосылды автор davidchambers, көзі
Менің ойымша, сізге -1 керек емес. i ішінде [sth.length-1..0] үшін жұмыс істейді
қосылды автор Ricardo Tomasi, көзі
@Robert жақсы ұстау. i үшін [sth.length-1 ...- 1] «түзетулер» деген: D
қосылды автор Ricardo Tomasi, көзі
@RicardoTomasi sth - бос массив болса - 1 керек. Әйтпесе, цикл күтілгеннен екі есе көп болады (нөлдік уақыт). Бір рет -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 ()} индексінде # {index}» элементінде элемент, индекс синтаксисін пайдалануға болады, 1
қосылды автор glampr, көзі

Әртүрлі жазба үшін:

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

(жалған мәндер бойынша бұзылады)

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 @ редакциялау уақыты)

1
қосылды

Idiomatic жолы ( docs ) келесі жолдар бойынша:

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

(@ Trevor жазбасынан кейін өңделген)

Өңдеу:

Дегенмен, өнімділік өте маңызды болса, бұл баламалы, бірақ эстетикалық схема аз болуы мүмкін 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, көзі
Оң, тіркелген код. 2-ші нұсқа дұрыс.
қосылды автор Jacob Oscarson, көзі

Циклдарға арналған индекске негізделген азайту үшін, сіз төмендегілерді пайдалана аласыз:

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

Бұл @TrevorBurnham деп аталатын қателікті алып тастайды, соңғы нүктелерді өзіңіз көрсете отырып мәселе.

something.length - бұл 0 болғанда, бұл тең

for i in []
0
қосылды