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