我正在寻找一种简单的方法来打破forEach。这个答案提到了使用some方法,但是没有给出当前元素的索引:How to short circuit Array.forEach like calling break?
我发现将数组设置为false会破坏forEach“循环”。这有效还是黑客?
答案 0 :(得分: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
如果您将.length
设置为false
,则有效地将其设置为0
,因此您将清除整个数组。
使用.some
或.every
对我来说似乎更明智。
我应该注意,迭代不一定会停止,但是不会调用您的回调,因为本机.forEach()
不会为不存在的属性调用回调。根据规范,缓存的长度。
这可以通过在迭代期间扩展Array来测试。添加的成员永远不会到达。
答案 1 :(得分:0)
根据文档,当前元素的索引作为第二个参数传递给回调函数:
语法: 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);