为什么原始数组中的剩余数= [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);
}
答案 0 :(得分:2)
这是因为每次拼接功能运行时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,6,8,10]
答案 1 :(得分:0)
您想知道为什么要删除1,3、5、7和9,对吗?
这就是原因。随着for循环的迭代,i
不断增加一。
但是,通过调用.splice
,您将删除数组的第一个元素,因此,所有其他元素都向下移动索引。
让我们逐步进行一下for循环的迭代。
i = 0; arr.splice(0, 1)
删除1,因此arr
是[2, 3, 4, 5, 6, 7, 8, 9, 10]
i = 1; arr.splice(1, 1)
删除了 3 而不是2,因为现在3在arr
的索引1处。执行拼接将arr
保留为[2, 4, 5, 6, 7, 8, 9, 10]
。
i = 2; arr.splice(2, 1)
删除5,因为5当前位于索引2。结果,arr
变成[2, 4, 6, 7, 8, 9, 10]
。
现在不清楚发生了什么吗?
如果您的目标是每次依次删除每个元素,则不要在循环的每次迭代中调用.splice(i, 1)
,而应调用.splice(0, 1)
,因为索引0的值会更改每次您致电.splice
。
答案 2 :(得分:0)
您需要检查for循环结束条件,我没有增加到10。为什么?因为我<长度 所以会这样:
迭代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]
因此,如果要使用拼接删除所有项目:
let arr = [1,2,3,4,5,6,7,8,9,10];
while(arr.length > 0) {
arr.splice(0, 1);
}
答案 3 :(得分:0)