2013-02-15 37 views
5

Câu hỏi Noob. Tôi đang cố gắng viết một vòng lặp for với một phạm vi. Ví dụ, đây là những gì tôi muốn sản xuất trong JavaScript:cho vòng lặp có phạm vi trong 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); 
    } 
} 

Gần nhất tôi đã đi cho đến nay là những điều sau đây, nhưng

  1. Nó tạo ra không cần thiết và lát đắt gọi
  2. truy cập chiều dài mảng bên trong vòng lặp bên trong

CoffeeScript:

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

Tạo mã:

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

(thế nào) có thể này được thể hiện trong CoffeeScript?

Trả lời

8

Về cơ bản, sao chép mã JS đầu tiên bạn đến 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

Cảm ơn, điều đó có hiệu quả. Tôi không hiểu tại sao nó vẫn tạo ra một vài vòng lặp không cần thiết, nhưng tôi có thể sống với điều đó. – alekop

+1

@alekop Tôi cho rằng lý do chính cho các bộ đếm bổ sung đó là nếu bạn thay đổi biến vòng lặp ('i' hoặc' j') bên trong vòng lặp, bạn không thay đổi các vòng lặp của vòng lặp. – epidemian

1

Có vẻ như cách duy nhất để tránh các biến thêm là với một vòng lặp 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++ 

hoặc một chút ít có thể đọc:

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

Đó không phải chính xác những gì mã ban đầu. Phạm vi vòng lặp ngoài là 0..n-1, trong khi phạm vi bên trong là i + 1..n. – alekop

+0

@alekop xin lỗi về điều đó .. Tôi không đọc kỹ câu hỏi. – Slai

Các vấn đề liên quan