2013-02-15 10 views
5

Noob question. Sto provando a scrivere un ciclo for con un intervallo. Ad esempio, questo è quello che voglio produrre in JavaScript:per loop con intervallo 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); 
    } 
} 

Il più vicino che ho fatto tanta strada è la seguente, ma

  1. Esso genera inutili e costosi fetta chiama
  2. accessi la lunghezza della matrice all'interno del ciclo interno

CoffeeScript:

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

codice generato:

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

(Come) può questo essere espressa in CoffeeScript?

risposta

8

Fondamentalmente, trascrivendo il vostro primo codice JS per 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

Grazie, funziona. Non capisco perché genera ancora alcuni contatori di loop inutili, ma posso conviverci. – alekop

+1

@alekop Penso che il principale razionale per quei contatori extra sia che se si modifica la variabile di ciclo ('i' o' j') all'interno del ciclo, non si cambiano le iterazioni del ciclo. – epidemian

1

Sembra che l'unico modo per evitare le variabili aggiuntive è con un while ciclo 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++ 

o un po 'meno leggibile:

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

Questo non è esattamente ciò che fa il codice originale. L'intervallo del ciclo esterno è 0..n-1, mentre l'intervallo interno è i + 1..n. – alekop

+0

@alekop mi dispiace per quello .. Non ho letto attentamente la domanda. – Slai