2013-02-15 9 views
5

Noob pytanie. Próbuję napisać pętlę for z zakresem. Na przykład, jest to, co chcę produkować w JavaScript:dla pętli z zakresem w 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); 
    } 
} 

najbliższy Doszedłem tak daleko jest następujące, ale

  1. generuje niepotrzebne i kosztowne kawałek nazywa
  2. dostępy długość tablicy wewnątrz pętli wewnętrznej

coffeescript:

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

Wygenerowany kod:

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); 
    } 
} 

(Jak) może być wyrażona w coffeescript?

Odpowiedz

8

Zasadniczo transkrypcji swój pierwszy kod JS do 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

Dzięki, że działa. Nie rozumiem, dlaczego wciąż generuje kilka niepotrzebnych liczników pętli, ale mogę z tym żyć. – alekop

+1

@alekop Myślę, że głównym uzasadnieniem dla tych dodatkowych liczników jest to, że jeśli zdarzy ci się zmodyfikować zmienną pętli ('i' lub' j') w pętli, nie zmienisz iteracji pętli. – epidemian

1

wydaje się, że jedynym sposobem na uniknięcie dodatkowych zmiennych jest z while pętli 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++ 

lub nieco mniej czytelny:

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

To nie jest dokładnie to, co robi oryginalny kod. Zewnętrzny zakres pętli to 0..n-1, a wewnętrzny zakres to i + 1.n. – alekop

+0

@alekop przepraszam za to .. Nie przeczytałem dokładnie tego pytania. – Slai