【发布时间】:2019-11-04 10:34:27
【问题描述】:
我知道它适用于 Set,但我的印象是它也适用于 Array。所以我在 Chrome 中试了一下,很惊讶它不起作用:
const array = [1,2,3,4,5,6]
for (const item of array) {
if (item === 3 || item === 4) {
array.splice(array.indexOf(item), 1);
}
}
console.log(array) // [1,2,4,5,6]
它没有删除4。
所以我的问题是,迭代安全是否只适用于 Set 和 Map,而不适用于 Array?
(如果是这种情况,那么除了简单的语法之外,我看不出使用它比for(;;) 有什么好处。我的印象是for..of 可以防止错误,即使使用@ 987654330@,就像 Set 和 Map)
注意,作为一个技巧,我可以通过克隆数组(或反向迭代)来做到这一点:
const array = [1,2,3,4,5,6]
for (const item of Array.from(array)) {
if (item === 3 || item === 4) {
array.splice(array.indexOf(item), 1);
}
}
console.log(array) // [1,2,5,6]
【问题讨论】:
-
您是否尝试过不相邻的元素?这可能是 4 移回索引 3 导致基本上跳过的结果。反向迭代有效的事实支持了该理论。至于克隆版本,这无关紧要,因为您正在对恰好具有相同元素的两个不同数组执行两个不同的操作。
-
@AvinKavish 当然,这可能适用于这种特殊情况,但它适用于 Set(迭代时删除 3 和 4)。
-
Set 必须有一个不是简单索引访问的迭代器。
-
@AvinKavish Yes indeed
-
@Bergi 为什么 ArrayIterator 被设计成不像 Set 或 Map 那样方便?
标签: javascript arrays iteration for-of-loop