重置数组是从Array.forEach中断的有效方法吗?

时间:2012-11-05 22:19:52

标签: javascript arrays

我正在寻找一种简单的方法来打破forEach。这个答案提到了使用some方法,但是没有给出当前元素的索引:How to short circuit Array.forEach like calling break?

我发现将数组设置为false会破坏forEach“循环”。这有效还是黑客?

2 个答案:

答案 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

请参阅documentation here


更重要的是......

你有什么理由不能正常地做到这一点:

var matchIndex = -1;
for (i = 0; i < someArray.length; i++) {
    if (isFound(someArray[i])) {
        matchIndex = i;
        break;
    }
}
alert("Mathing index: " + matchIndex);