7

ノブの質問です。範囲を指定して 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);
    }
}

これまでに最も近いのは次のとおりですが、

  1. 不必要で高価なスライス呼び出しを生成します
  2. 内側のループ内で配列の長さにアクセスします

コーヒースクリプト:

for a, i in a[0...a.length-1]
    for b, j in a[i+1...a.length]
        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);
  }
}

(どのように) これを CoffeeScript で表現できますか?

4

2 に答える 2

10

基本的に、最初の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
于 2013-02-15T02:43:18.610 に答える
1

余分な変数を回避する唯一の方法は、whileループ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++

または少し読みにくい:

i = 0; len = arr.length - 1
while i < len
  a = arr[i++]; j = i
  while j <= len
    doSomething a, arr[j++]
于 2017-09-29T23:03:23.670 に答える