2013-02-15 259 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

基本上,錄製你的第一個JS代碼到CS:

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 2013-02-15 18:08:46

+1

@alekop我認爲這些額外的計數器的主要理由是,如果你碰巧修改循環內的循環變量('i'或'j'),那麼你不會改變循環的迭代次數。 – epidemian 2013-02-15 19:24:48

1

似乎想避免額外的變量的唯一方法是用whilehttp://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 2017-10-02 17:34:33

+0

@alekop對此抱歉。我沒有仔細閱讀這個問題。 – Slai 2017-10-02 18:41:28