-3

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

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

4

2 回答 2

2

如果您的意思是将其设置.length为迭代中的当前索引,那么是的,它是“有效的”,但请注意,这样做会从那时起清除任何 Array 成员。

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

根据文档,当前元素的索引作为第二个参数传递给回调函数:

语法: 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 回答