2013-02-15 12 views
5

Noobの質問私は、範囲とforループを記述しようとしています。たとえば、これは私がJavaScriptで生成したいものである:私はこれまで来ているfor CoffeeScriptの範囲のループ

var i, a, j, b, len = arr.length; 
for (i = 0; i < len - 1; i++) { 
    a = arr[i]; 
    for (j = i + 1; i < len; j++) { 
     b = arr[j]; 
     doSomething(a, b); 
    } 
} 

最も近いは以下の通りですが、

  1. 不必要で高価なスライスが
  2. のアクセスを呼び出し生成します内部ループ

CoffeeScriptの内部配列の長さ:

for a, i in a[0...a.length-1] 
    for b, j in a[i+1...a.length] 
     doSomething a, b 

生成されたコード:

var a, b, i, j, _i, _j, _len, _len1, _ref, _ref1; 

_ref = a.slice(0, a.length - 1); 
for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { 
    a = _ref[i]; 
    _ref1 = a.slice(i + 1, a.length); 
    for (j = _j = 0, _len1 = _ref1.length; _j < _len1; j = ++_j) { 
    b = _ref1[j]; 
    doSomething(a, b); 
    } 
} 

(どのように)これはCoffeeScriptの中で表現することができますか?

答えて

8

基本的には、CSへのあなたの最初のJSコード転記:

len = arr.length 
for i in [0...len - 1] by 1 
    a = arr[i] 
    for j in [i + 1...len] by 1 
    b = arr[j] 
    doSomething a, b 
+0

ありがとうございます。私はなぜそれがまだいくつかの不要なループカウンタを生成するのか分からないが、私はそれで生きることができる。 – alekop

+1

@alekopループ内でループ変数( 'i'または' j')を変更した場合、ループの反復を変更しないということが、余分なカウンタの主な理由だと思います。 – epidemian

1

すると、余分な変数を避ける唯一の方法のように思えることはwhileループhttp://js2.coffee

i = 0 
len = arr.length 

while i < len - 1 
    a = arr[i] 
    j = i + 1 
    while j < len 
    b = arr[j] 
    doSomething a, b 
    j++ 
    i++ 

またはビット読みにくくしています。

i = 0; len = arr.length - 1 
while i < len 
    a = arr[i++]; j = i 
    while j <= len 
    doSomething a, arr[j++] 
+1

元のコードとまったく同じではありません。外側ループ範囲は0..n-1であり、内側範囲はi + 1..nです。 – alekop

+0

@alekopそれについて申し訳ありません。私は慎重に質問を読んでいませんでした。 – Slai

関連する問題