13

次のようなスパース配列があります(インデックスは連続していません):

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };

各アイテムを繰り返し処理し、いくつかのことを行い、特定の条件下で中断できるようにしたいと思います。

私はJavascriptにかなり慣れていないので、適切な方法が見つかりませんでした。これが私が試したものです:

  1. 組み込みの「for..in」。これは配列を反復処理する正しい方法ではないようです

  2. ECMASCRIPT5 からのforEach。これは正しく繰り返されますが、ループから抜け出すことはできません。

  3. Underscore.js の _.each()。#2と同じ結果。

  4. $.each() JQuery から。これを使用すると、false を返すことで中断できますが、正しく繰り返されません。上記の例では、0、5、10、15 で反復する代わりに、0、1、2、3、4、5、6 で反復します... これは明らかに私が期待するものではありません。

だから私の質問は次のとおりです:Javascriptのループ中に壊れる可能性があるスパース配列を反復する簡単な方法はありますか、それともハッシュテーブルのような別のデータ構造を使用する方が良いでしょうか? もしそうなら、何か推奨事項はありますか?

ありがとう!

4

5 に答える 5

10

for...in構文の何が問題になっていますか? オブジェクトがあるので、for...in構文は完全に有効です。

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };

for (var key in testArray) {
  var value = testArray[key];

  if (...) {
    break;
  }
}
于 2012-05-13T03:32:26.023 に答える
3

オブジェクトハッシュに取り組んでいるとき、 for..in は最悪のことではありません。配列 ( ) での使用は避ける[]べきですが、ここでは問題ありません。

var val;
for (index in testArray) {
  if (index == 10) {
    break;
  } else {
    val = testArray[index];
  }
}
于 2012-05-13T03:33:01.143 に答える
2

あなたがさようならにキスしなければならない最初のものは「配列」です。ArrayECMAscriptには本当の意味はありません(型付き配列とバイナリトリックを忘れる)。

だからあなたがそこに持っているのは明白Objectです。それを繰り返すために.forEach、ES5に慣れている場合は使用することをお勧めします。その反復を早期に中断する必要がある場合は、次のような.some()または.every()のようなES5メソッドを使用することをお勧めします。

Object.keys( testArray ).some(function( key ) {
    if( +key < 15 ) {            
        return true;
    }

    console.log(key, testArray[key]);
});

これは、数値が15以上のキーに遭遇したときに、を返すことによって反復を中断しますtrue

于 2012-05-13T03:36:08.443 に答える