2013-02-15 10 views
5

Noob Frage. Ich versuche eine For-Schleife mit einem Bereich zu schreiben. Zum Beispiel ist es das, was ich in JavaScript produzieren wollen:für Schleife mit Bereich in 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); 
    } 
} 

Die nächstgelegene Ich bin gekommen, so weit ist die folgende, aber

  1. Es erzeugt unnötige und teure Scheibe nennt
  2. Zugriffe die Array-Länge innerhalb der inneren Schleife

Coffee:

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

Code generiert:

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

(Wie) kann dies in Coffeescript ausgedrückt werden?

Antwort

8

Grundsätzlich ersten JS Code CS Transkribieren:

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

Danke, das funktioniert. Ich verstehe nicht, warum es immer noch ein paar unnötige Schleifenzähler erzeugt, aber damit kann ich leben. – alekop

+1

@alekop Ich denke, das Hauptrational für diese zusätzlichen Zähler ist, dass wenn Sie die Schleifenvariable ("i" oder "j") innerhalb der Schleife ändern, ändern Sie nicht die Schleifen Iterationen. – epidemian

1

Scheint, wie der einzige Weg, um die zusätzlichen Variablen zu vermeiden, ist mit einer while Schleife 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++ 

oder ein bisschen weniger lesbar:

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

Das ist nicht genau das, was der ursprüngliche Code tut. Der äußere Schleifenbereich ist 0..n-1, während der innere Bereich i + 1..n ist. – alekop

+0

@alekop sorry darüber .. Ich habe die Frage nicht sorgfältig gelesen. – Slai

Verwandte Themen