数组在for循环中使用splice方法导致索引错乱的问题
2018-03-29 16:12
507 查看
数组的方法基本简介
在开发程序的过程中,我们经常使用数组和它的相关方法。
就如追加元素push()方法
在首部添加元素的unshift()方法
还有删除最后一个元素的方法pop()方法....
有很多,我就不一一列举了,其实我觉得不用记的,有一个印象就行,用法这些有印象开发的时候记不住就翻技术手册或者找度娘,我们要始终遵循一条宗旨:开发要把精力全部放在创造上,这些鸡皮蒜事有时候记得很容易混淆,也很杂
我这里要说的是splice()方法
数组的splice()方法
为什么偏偏拿这个splice()方法来讲呢?因为它 so important!
我给你普及一下,它可以干嘛?
+ 它可以在数组元素之间插值
+它可以删除任意位置任意多个的数组元素
+ 它可以替换任意位置的数组元素(当然,有上面两种就可以完成这个,只是我觉得要夸大一下它的作用)
我觉得,以上的三种作用是数组任何一个方法都无法取代的。相反,我觉得它可以取代绝大部分数组方法。什么删除增加,它一个顶两。不行,你可以试试。只是使用其他特定的方法在特定的时候会方便一些。就如在数组首部添加一个元素,使用unshift()方法,一个参数就行,splice()方法得3个。但是它确实是可以做到的。它的具体用法我就不详细说明了。但是,它的一个重要特性要提一提,那就是它处理后数组会发生相应的改变。你可以去W3C官网去看看,其实我觉得平时有个印象就行了,别太纠结哈。
for循环连续使用splice()方法删除数组元素的问题
splice()方法好用是好用,但是一下子用多了可就不妙了!就像一些补品,作用是好,但是一下子喝太多,那就有的受了哈哈。
具体说一下splice()在for循环中导致数组索引错乱的问题
结果:
这里就有这样的需求,把里面的id =num的元素删除,(假如id可以重复,这里假设有多个)。
然而,这结果吓我一跳~~
+ 那么假设执行一次删除,那么数组的元素会减少,那么数组的长度会相应地减少,但是i确实一直在增加的
+ 执行下一次的时候,第二个5已经成为了第一个5,但是i已经为1了,删不了了,于是就删了第二个5(原来排第三)
+ 与此类推,就可以得出这个结果
解决索引错乱类情况的方法
+ 当符合情况的时候,执行了splice方法,导致数组发生了改变,那么i也应该发生相应的改变,也就是符合情况的时候,i必须也得执行一次i自减(i--),保持与数组长度循环的节奏,然后你会看到
+ 还有一种想法,当然,我觉得这更是一种思想,没错,就是一种思想!
你想想,数组执行splice方法删除元素后,后面的元素会不断地往前面靠,导致了错乱的现象。
那你想想,假如从数组后面开始删除元素.........(这里留给你们想想)
- 那么问题来了,怎么从后面删除元素呢?
- 首先必须找到所有对应的元素的索引,把这些存在一个数组里
- 然后,利用数组的sort()排序方法,倒置这个元素位置的数组
- 依次删除对应索引的数组
这两种方法都可以试试,当然,适合你的就是好的哈哈。
追加一个方法:
晚上经过我的深思熟虑,感觉如果使用逆向思维更好理解!
就如到达山顶的道路有很多,我们不断地找一条最便捷道路上,只是我们从山下到山上一直找。
你可曾想过,或许,从山上眺望山下,这样找下山的道路可能更快!
对,于是我觉得假如需要用splice删除元素,不如把有用的元素存储起来!
于是有了下面的步骤:
+ 设置一个变量储存数组元素
+ 把有用的数组元素push到数组里面
+ 把数组的值赋值给原来的元素
我肯定,这样也可以得到你想要的结果,只是这不是使用splice()方法,所以我只是追加这个方法,但是它确实可以解决这个问题。
在开发程序的过程中,我们经常使用数组和它的相关方法。
就如追加元素push()方法
在首部添加元素的unshift()方法
还有删除最后一个元素的方法pop()方法....
有很多,我就不一一列举了,其实我觉得不用记的,有一个印象就行,用法这些有印象开发的时候记不住就翻技术手册或者找度娘,我们要始终遵循一条宗旨:开发要把精力全部放在创造上,这些鸡皮蒜事有时候记得很容易混淆,也很杂
我这里要说的是splice()方法
数组的splice()方法
为什么偏偏拿这个splice()方法来讲呢?因为它 so important!
我给你普及一下,它可以干嘛?
+ 它可以在数组元素之间插值
+它可以删除任意位置任意多个的数组元素
+ 它可以替换任意位置的数组元素(当然,有上面两种就可以完成这个,只是我觉得要夸大一下它的作用)
我觉得,以上的三种作用是数组任何一个方法都无法取代的。相反,我觉得它可以取代绝大部分数组方法。什么删除增加,它一个顶两。不行,你可以试试。只是使用其他特定的方法在特定的时候会方便一些。就如在数组首部添加一个元素,使用unshift()方法,一个参数就行,splice()方法得3个。但是它确实是可以做到的。它的具体用法我就不详细说明了。但是,它的一个重要特性要提一提,那就是它处理后数组会发生相应的改变。你可以去W3C官网去看看,其实我觉得平时有个印象就行了,别太纠结哈。
for循环连续使用splice()方法删除数组元素的问题
splice()方法好用是好用,但是一下子用多了可就不妙了!就像一些补品,作用是好,但是一下子喝太多,那就有的受了哈哈。
具体说一下splice()在for循环中导致数组索引错乱的问题
结果:
这里就有这样的需求,把里面的id =num的元素删除,(假如id可以重复,这里假设有多个)。
然而,这结果吓我一跳~~
+ 那么假设执行一次删除,那么数组的元素会减少,那么数组的长度会相应地减少,但是i确实一直在增加的
+ 执行下一次的时候,第二个5已经成为了第一个5,但是i已经为1了,删不了了,于是就删了第二个5(原来排第三)
+ 与此类推,就可以得出这个结果
解决索引错乱类情况的方法
+ 当符合情况的时候,执行了splice方法,导致数组发生了改变,那么i也应该发生相应的改变,也就是符合情况的时候,i必须也得执行一次i自减(i--),保持与数组长度循环的节奏,然后你会看到
+ 还有一种想法,当然,我觉得这更是一种思想,没错,就是一种思想!
你想想,数组执行splice方法删除元素后,后面的元素会不断地往前面靠,导致了错乱的现象。
那你想想,假如从数组后面开始删除元素.........(这里留给你们想想)
- 那么问题来了,怎么从后面删除元素呢?
- 首先必须找到所有对应的元素的索引,把这些存在一个数组里
- 然后,利用数组的sort()排序方法,倒置这个元素位置的数组
- 依次删除对应索引的数组
这两种方法都可以试试,当然,适合你的就是好的哈哈。
追加一个方法:
晚上经过我的深思熟虑,感觉如果使用逆向思维更好理解!
就如到达山顶的道路有很多,我们不断地找一条最便捷道路上,只是我们从山下到山上一直找。
你可曾想过,或许,从山上眺望山下,这样找下山的道路可能更快!
对,于是我觉得假如需要用splice删除元素,不如把有用的元素存储起来!
于是有了下面的步骤:
+ 设置一个变量储存数组元素
+ 把有用的数组元素push到数组里面
+ 把数组的值赋值给原来的元素
我肯定,这样也可以得到你想要的结果,只是这不是使用splice()方法,所以我只是追加这个方法,但是它确实可以解决这个问题。
相关文章推荐
- 使用Outlook发送邮件至移动设备导致移动设备接收winmail.dat问题解决方法
- 使用Ajax方法提交多个对象数组的问题
- 有关td使用colspan属性后导致td不能充满整个tr的问题解决方法
- 使用solr的DIHandler 构建mysql大表全量索引,内存溢出问题的解决方法
- 使用dwr同步调用导致无法获取js方法的返回结果问题的解决办法
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- php 操作数组array_merge使用时数组包含数字键名的问题解决方法
- ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
- iOS导航控制器使用interactivePopGestureRecognizer导致导航栏标题可能层次错乱的问题解决
- MultiDex使用方法及由此导致的crash、ANR问题解决方案
- 关于mysql中由于类型转换导致索引无法使用的问题
- 更改GetToolParts()方法中toolpart索引顺序导致的无法赋值的问题
- ThinkPHP 中 M 方法查询数据库最后使用 find() 导致返回结果集 foreach 数据不对的问题
- 关于使用Spring声明式事务时,在类的内部方法互相调用时,Spring无法拦截内部方法调用,导致事务不起作用的问题研究
- 使用数组的方法,解决Josephus问题
- ios 中 使用自制framework导致 Duplicate symbol 的问题解决方法
- 分页列表td中包含有<标签导致页面显示错乱问题,使用jstl <c:out>标签秒解决
- 使用asp.net的pageDataSource中时索引问题解决方法
- 一个页面中使用多个iframe导致在ie中假死问题的解决方法
- 使用asp.net的pageDataSource中时索引问题解决方法