29

JavaScript でループするいくつかの方法に出くわしましたが、私が最も気に入っているのは次のとおりです。

for(var i = 0; i < a.length; i++){
    var element = a[i];
}

しかし、ここ ( http://www.robertnyman.com/2008/04/11/javascript-loop-performance/ ) でテストしたように、長さが 1 回だけ計算されるように記述する必要があります。

jQuery には、関数を貼り付けることができる .each があります。上記のソリューションのように、配列を 2 回入力する必要がないため、これは少し気に入っています。

JavaScript がマクロをサポートしていれば、独自のマクロを作成するのは簡単なことですが、残念ながらそうではありません。

では、皆さんは何を使っていますか?

4

9 に答える 9

37

関連するイテレータの使用を開始しました。パフォーマンスは妥当ですが、さらに重要なのは、ループ ロジックをカプセル化できることです。

function createIterator(x) {
    var i = 0;

     return function(){
       return x[i++];
    };
}

次に使用します:

var iterator=createIterator(['a','b','c','d','e','f','g']);

iterator();

"a" を返します。

iterator();

"b" を返します。

等々。

リスト全体を反復して各項目を表示するには:

現在の変数;

while(現在=イテレータ())
{
    console.log(現在);
}

上記は、「偽りのない」値を含むリストを反復する場合にのみ許容されることに注意してください。この配列に次のいずれかが含まれている場合:

  • 0
  • 間違い
  • ""
  • ヌル
  • NaN

前のループはそのアイテムで停止しますが、常にあなたが望む/期待するものではありません。

この使用を避けるには:

var current;

while((current=iterator())!==undefined)
{
   console.log(current);
}
于 2008-10-11T01:35:12.737 に答える
10

配列サイズを一度だけ計算するように、元の小さな改善:

for(var i = 0, len = a.length; i < len; i++){ var element = a[i]; }

また、多くの for..in ループが見られます。ただし、技術的にはコーシャではなく、特にプロトタイプで問題が発生することに注意してください。

for (i in a) { var element = a[i]; }
于 2008-10-11T01:51:57.697 に答える
6

最初に長さを変数に格納するだけです。

  var len = a.length;
  for (var i = 0; i < len; i++) {
    var element = a[i];
  }
于 2008-10-11T02:01:09.440 に答える
6

私はパーティーに遅れていることを知っていますが、順序に依存しないループには逆ループを使用します。

@Mr.によく似ています。Muskrat の - ただし、テストを簡素化します。

var i = a.length, element = null;
while (i--) {
  element = a[i];
}
于 2008-10-14T15:10:54.930 に答える
2

常に while ループを使用して、事前に配列の制限を計算することができます。

Var max = a.length-1;
var i = 0;

while(i <= max)
{
var element = a[i];
i++;
}
于 2008-10-11T01:26:00.120 に答える
1

私自身は使用していませんが、同僚の1人がこのスタイルを使用しています。

var myArray = [1,2,3,4];
for (var i = 0, item; item = myArray[i]; ++i) {
    alert(item);
}

Ashの答えのように、配列に「falsey」の値がある場合、これは問題になります。その問題を回避するには、次のように変更します(item = myArray[i]) != undefined

于 2008-10-12T10:14:12.080 に答える
1

配列に多くの要素があり、速度が問題になる場合は、最高から最低まで反復する while ループを使用します。

  var i = a.length;
  while( --i >= 0 ) {
    var element = a[i];
    // do stuff with element
  }  
于 2008-10-11T18:49:45.410 に答える
0

標準のfor(;;)ループを使用する際の問題が何であるかわかりません。ちょっとしたテスト

var x;
var a = [];
// filling array
var t0 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
    a[i] = Math.floor( Math.random()*100000 );
}

// normal loop
var t1 = new Date().getTime();
for( var i = 0; i < 100000; i++ ) {
    x = a[i];
}

// using length
var t2 = new Date().getTime();
for( var i = 0; i < a.length; i++ ) {
    x = a[i];
}

// storing length (pollution - we now have a global l as well as an i )
var t3 = new Date().getTime();
for( var i = 0, l = a.length; i < l; i++ ) {
    x = a[i];
}

// for in
var t4 = new Date().getTime();
for( var i in a ) {
    x = a[i];
}

// checked for in
var t5 = new Date().getTime();
for( var i in a ) {
    if (a.hasOwnProperty(i)) {
        x = a[i];
    }
}

var t6 = new Date().getTime();
var msg = 'filling array: '+(t1-t0)+'ms\n'+
          'normal loop: '+(t2-t1)+'ms\n'+
          'using length: '+(t3-t2)+'ms\n'+
          'storing length: '+(t4-t3)+'ms\n'+
          'for in: '+(t5-t4)+'ms\n'+
          'checked for in: '+(t6-t5)+'ms';
console.log( msg );

結果:

filling array: 227ms
normal loop: 21ms
using length: 26ms
storing length: 24ms 
for in: 154ms
checked for in: 176ms

したがって:-inが最も長くかかるため、lengthプロパティ(プロパティであり、計算する必要はありません)を使用すると、最初に格納するのとほぼ同じくらい高速になります。これは、整数を使用するよりもひげが遅いだけです。
AND for()は、配列をループする通常の方法であり、誰もが期待して理解しています。

それらはすべて、実行するスコープに変数を追加します-i-これはこの用途の一般名であるため、他の目的には使用しないでください。長さを最初に保存すると、スコープに別のvar --l--が追加されますが、これは不要です。

于 2009-01-07T23:09:36.297 に答える
-2

したがって、最初に完全な JavaScript ループを特定すると、次のようになるはずです。

ary.each(関数() {$arguments[0]).remove();})

これには、prototype.js ライブラリが必要になる場合があります。

次に、arguments[0] の部分にうんざりして、コードをサーバー フレームワークから自動的に生成します。これは、はしごが海辺の場合にのみ機能します。

これで、上記が次のように生成されました。

アリドゥ: [:each | 各要素を削除]。

これには構文補完が付属しており、上記の JavaScript に正確に変換されます。また、これまでシーサイド プロトタイプの統合を使用したことがない人々は、コードを読んで頭が回転します。気分も爽快になること間違いなしです。ここで得られるマニアックさの向上は言うまでもありません。女の子はそれが大好きです!

于 2009-01-07T20:25:06.003 に答える