数组在for循环中使用splice方法导致索引错乱的问题

数组的方法基本简介

在开发程序的过程中,我们经常使用数组和它的相关方法。

就如追加元素push()方法

在首部添加元素的unshift()方法

还有删除最后一个元素的方法pop()方法....

有很多,我就不一一列举了,其实我觉得不用记的,有一个印象就行,用法这些有印象开发的时候记不住就翻技术手册或者找度娘,我们要始终遵循一条宗旨:开发要把精力全部放在创造上,这些鸡皮蒜事有时候记得很容易混淆,也很杂

我这里要说的是splice()方法

数组的splice()方法

为什么偏偏拿这个splice()方法来讲呢?因为它 so important!

我给你普及一下,它可以干嘛?

    + 它可以在数组元素之间插值

    +它可以删除任意位置任意多个的数组元素

    + 它可以替换任意位置的数组元素(当然,有上面两种就可以完成这个,只是我觉得要夸大一下它的作用)

我觉得,以上的三种作用是数组任何一个方法都无法取代的。相反,我觉得它可以取代绝大部分数组方法。什么删除增加,它一个顶两。不行,你可以试试。只是使用其他特定的方法在特定的时候会方便一些。就如在数组首部添加一个元素,使用unshift()方法,一个参数就行,splice()方法得3个。但是它确实是可以做到的。它的具体用法我就不详细说明了。但是,它的一个重要特性要提一提,那就是它处理后数组会发生相应的改变。你可以去W3C官网去看看,其实我觉得平时有个印象就行了,别太纠结哈。

for循环连续使用splice()方法删除数组元素的问题

splice()方法好用是好用,但是一下子用多了可就不妙了!就像一些补品,作用是好,但是一下子喝太多,那就有的受了哈哈。

具体说一下splice()在for循环中导致数组索引错乱的问题

数组在for循环中使用splice方法导致索引错乱的问题

结果:

数组在for循环中使用splice方法导致索引错乱的问题

这里就有这样的需求,把里面的id =num的元素删除,(假如id可以重复,这里假设有多个)。

然而,这结果吓我一跳~~

+ 那么假设执行一次删除,那么数组的元素会减少,那么数组的长度会相应地减少,但是i确实一直在增加的

+ 执行下一次的时候,第二个5已经成为了第一个5,但是i已经为1了,删不了了,于是就删了第二个5(原来排第三)

+  与此类推,就可以得出这个结果

解决索引错乱类情况的方法

+  当符合情况的时候,执行了splice方法,导致数组发生了改变,那么i也应该发生相应的改变,也就是符合情况的时候,i必须也得执行一次i自减(i--),保持与数组长度循环的节奏,然后你会看到

数组在for循环中使用splice方法导致索引错乱的问题

+ 还有一种想法,当然,我觉得这更是一种思想,没错,就是一种思想!

你想想,数组执行splice方法删除元素后,后面的元素会不断地往前面靠,导致了错乱的现象。

那你想想,假如从数组后面开始删除元素.........(这里留给你们想想)

    - 那么问题来了,怎么从后面删除元素呢?

    - 首先必须找到所有对应的元素的索引,把这些存在一个数组里

    - 然后,利用数组的sort()排序方法,倒置这个元素位置的数组

    - 依次删除对应索引的数组

数组在for循环中使用splice方法导致索引错乱的问题

这两种方法都可以试试,当然,适合你的就是好的哈哈。

追加一个方法:

晚上经过我的深思熟虑,感觉如果使用逆向思维更好理解!

就如到达山顶的道路有很多,我们不断地找一条最便捷道路上,只是我们从山下到山上一直找。

你可曾想过,或许,从山上眺望山下,这样找下山的道路可能更快!

对,于是我觉得假如需要用splice删除元素,不如把有用的元素存储起来!

于是有了下面的步骤:

    + 设置一个变量储存数组元素

    + 把有用的数组元素push到数组里面

    + 把数组的值赋值给原来的元素

我肯定,这样也可以得到你想要的结果,只是这不是使用splice()方法,所以我只是追加这个方法,但是它确实可以解决这个问题。