-3

forEach から抜け出す簡単な方法を探していました。This answerはsomeメソッドの使用について言及していますが、それは現在の要素のインデックスを提供しません: How to short circuit Array.forEach like calling break?

配列を false に設定すると、forEach の「ループ」が中断されることがわかりました。それは有効ですか、それともハックですか?

4

2 に答える 2

2

反復の現在のインデックスに設定することを意味する場合.length、はい、それは「有効」ですが、そうすることで、その時点から配列メンバーをクリアしていることに注意してください。

var arr = ["foo","bar","baz"];

console.log(arr.length); // 3

arr.forEach(function(v, i) {
    if (i == 1)
        arr.length = i;
    else 
        console.log(v);
});

console.log(arr.length); // 1

を に設定する.lengthfalse、実質的に に設定され0、配列全体がクリアされます。

.someorを使用する.everyと、私にはより賢明に思えます。


反復は必ずしも停止するわけではあり.forEach()ませんが、ネイティブは存在しないプロパティのコールバックを呼び出さないため、コールバックは呼び出されないことに注意してください。仕様によると、長さはキャッシュされます。

これは、反復中に配列を拡張することでテストできます。追加されたメンバーに到達することはありません。

于 2012-11-05T22:25:53.523 に答える
0

ドキュメントによると、現在の要素のインデックスは、2 番目のパラメーターとしてコールバック関数に渡されます。

構文: array.some(callback[, thisObject])

callback is invoked with three arguments: 
   1. the value of the element
   2. the index of the element
   3. the Array object being traversed

こちらのドキュメントを参照してください


さらに重要なことには...

通常の方法でそれを行うことができない理由はありますか?

var matchIndex = -1;
for (i = 0; i < someArray.length; i++) {
    if (isFound(someArray[i])) {
        matchIndex = i;
        break;
    }
}
alert("Mathing index: " + matchIndex);
于 2012-11-05T22:40:46.747 に答える