对于CoffeeScript中包含范围的循环

对于CoffeeScript中包含范围的循环,coffeescript,Coffeescript,诺布问题。我正在尝试编写一个范围为的for循环。例如,这就是我想要在JavaScript中生成的内容: 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); } } 生成的代码: var a, b, i

诺布问题。我正在尝试编写一个范围为的for循环。例如,这就是我想要在JavaScript中生成的内容:

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);
    }
}
生成的代码:

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);
  }
}
变量a、b、i、j、_i、_j、_len、_len1、_ref、_ref1;
_ref=a.切片(0,a.长度-1);
对于(i=_i=0,_len=_ref.length;_i<_len;i=++_i){
a=_ref[i];
_ref1=a.切片(i+1,a.长度);
对于(j=_j=0,_len1=_ref1.length;_j<_len1;j=+_j){
b=_ref1[j];
剂量测定法(a,b);
}
}

(如何)这可以用CoffeeScript来表达?

基本上,将您的第一个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

似乎避免额外变量的唯一方法是使用
while
循环

i=0
len=arr.length
而我
或者可读性稍差一些:

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

虽然j谢谢,但这很有效。我不明白为什么它仍然会生成一些不必要的循环计数器,但我可以接受。@alekop我认为这些额外计数器的主要原因是,如果您碰巧修改了循环内的循环变量(
I
j
),则不会更改循环的迭代次数。这与原始代码的功能不完全相同。外循环范围是0..n-1,而内循环范围是i+1..n.@alekop对此表示抱歉。。我没有仔细阅读这个问题。
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++]