[英]Using splice to delete item in array
为什么原始数组中的剩余部分 = [1, 3, 5, 7, 9]
由于 arr.splice(i, 1) = i 是目标索引,1 是要删除的项数,因此 i 分别从 i++ 增加到 10,即 i = i + 1 的缩写,那么为什么要删除 5 个索引并在数组中保留 5 ? 这就是我到目前为止所知道的,我一直在努力阅读文档,但仍然不知道要理解,请为我解释一下
let arr = [1,2,3,4,5,6,7,8,9,10];
for(let i = 1; i < arr.length; i++) {
arr.splice(i, 1);
}
这是因为每次 splice 函数运行时,arr 的长度都会减少。 这是数组的变化方式。
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 9, 10]
[2, 4, 6, 8, 10]
所以每个循环,i 增加,arr.length 减少 1。所以只有 5 个循环运行,结果是 [2, 4, 6, 8, 10]
您想知道为什么要删除 1、3、5、7 和 9,对吗?
这是为什么。 随着 for 循环的迭代, i
不断增加 1。 但是,通过调用.splice
,您正在删除数组的第一个元素,因此,每个其他元素都会向下移动一个索引。
让我们在 for 循环的几次迭代中一步一步地进行。
我 = 0; arr.splice(0, 1)
移除 1,所以arr
是[2, 3, 4, 5, 6, 7, 8, 9, 10]
我 = 1; arr.splice(1, 1)
删除3 ,而不是 2 ,因为现在 3 位于arr
索引 1 处。 执行拼接使arr
为[2, 4, 5, 6, 7, 8, 9, 10]
。
我 = 2; arr.splice(2, 1)
删除 5,因为 5 当前位于索引 2 处。因此, arr
变为[2, 4, 6, 7, 8, 9, 10]
。
现在清楚是怎么回事了吗?
如果您的目标是连续删除每个元素,一次一个,那么您应该调用.splice(0, 1)
而不是在循环的每次迭代中调用.splice(i, 1)
.splice(0, 1)
,因为索引 0 处的值每次调用.splice
时都会发生变化。
您需要检查 for 循环结束条件,i 没有增加到 10。为什么? 因为我 < arr.length。 所以它会像这样:
迭代 1:
i=0; arr.length = 10; arr = [1,2,3,4,5,6,7,8,9,10]; ==> result [2,3,4,5,6,7,8,9,10];
迭代 2:
i=1; arr.length = 9; arr = [2,3,4,5,6,7,8,9,10]; ==> result [2,4,5,6,7,8,9,10];
迭代 3:
i=2; arr.length = 8; arr = [2,4,5,6,7,8,9,10]; ==> result [2,4,6,7,8,9,10];
. . .等等
i = 5 ==> arr.length: 5 ==> final result : [2, 4, 6, 8, 10]
因此,如果您想使用 splice 删除所有项目:
let arr = [1,2,3,4,5,6,7,8,9,10];
while(arr.length > 0) {
arr.splice(0, 1);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.