forEach から抜け出す簡単な方法を探していました。This answerはsomeメソッドの使用について言及していますが、それは現在の要素のインデックスを提供しません: How to short circuit Array.forEach like calling break?
配列を false に設定すると、forEach の「ループ」が中断されることがわかりました。それは有効ですか、それともハックですか?
forEach から抜け出す簡単な方法を探していました。This answerはsomeメソッドの使用について言及していますが、それは現在の要素のインデックスを提供しません: How to short circuit Array.forEach like calling break?
配列を false に設定すると、forEach の「ループ」が中断されることがわかりました。それは有効ですか、それともハックですか?
反復の現在のインデックスに設定することを意味する場合.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
を に設定する.length
とfalse
、実質的に に設定され0
、配列全体がクリアされます。
.some
orを使用する.every
と、私にはより賢明に思えます。
反復は必ずしも停止するわけではあり.forEach()
ませんが、ネイティブは存在しないプロパティのコールバックを呼び出さないため、コールバックは呼び出されないことに注意してください。仕様によると、長さはキャッシュされます。
これは、反復中に配列を拡張することでテストできます。追加されたメンバーに到達することはありません。
ドキュメントによると、現在の要素のインデックスは、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);