coffeescriptのループを減らす

私は、次のようなcoffeescriptで増分forループを行う方法を知っています:

Coffeescript:

for some in something

生成されたJavascript:

for (_i = 0, _len = something.length; _i < _len; _i++)

どのように私はCoffeescriptでこれに似たfor減少ループを作成するのですか?

for (var i = something.length-1; i >= 0; i--)
26

6 答え

編集:CoffeeScript 1.5の時点で、 -1での構文がサポートされています。

まず、ステップを指定できる by キーワードを理解しておく必要があります。次に、CoffeeScriptコンパイラがエンドポイントをループするための非常に単純なアプローチを取っていることを理解する必要があります(問題1187 を参照してください)。

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真、CoffeeScript 1.3.1以降。
追加された 著者 Trevor Burnham,
array [..]array.slice(0)の省略形です。
追加された 著者 davidchambers,
私はあなたが -1 を必要としないと思う。 [sth.length-1..0] の が正常に動作します
追加された 著者 Ricardo Tomasi,
@ロバーツ良いキャッチ。 i [sth.length-1 ...-1] の "fixes"は次のようになります。D
追加された 著者 Ricardo Tomasi,
@RicardoTomasi sth が空の配列の場合は、 -1でする必要があります。そうでなければ、ループは予想より2倍多く(ゼロ回)実行されます。 -1 の場合は1回、 0 の場合は1回です。
追加された 著者 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
追加された
また、 element.index の構文を以下のように使用することもできます: console.log "#{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

しかし、最近のバージョンでは削除されています。 編集:それは今動作する(編集の1.6.2 @時間)

1
追加された

慣用的な方法(ドキュメントから):

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'] を試してみると、出力は 321
追加された 著者 Trevor Burnham,
右、固定コード。しかし第2版は正しいです。
追加された 著者 Jacob Oscarson,

減少する索引ベースのforループの場合は、次のものを使用できます。

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

これは、厄介さを取り除く@TrevorBurnhamは、あなた自身でエンドポイントを指定する際の問題です。

something.length0 の場合、これは

for i in []
0
追加された