如何解决数组的splice方法在for循环中出现的问题?

2023-11-10 10:40

本文主要是介绍如何解决数组的splice方法在for循环中出现的问题?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

产生问题的场景:

在这里插入图片描述
在这里插入图片描述
在做下拉框选中项左右移动的练习时,出现了上图所示的问题,当我选择的是“法国”、“美国”、“英国”,点击‘选中项右移’,会出现undefined选项,并且"美国"选项没有移动到右边的下拉框中。代码如下

<script type="text/javascript">var unSelArr=['中国','美国','俄罗斯','英国','法国'];var selArr=[]var ulSel=document.getElementById('ulSel')var sel=document.getElementById('sel')ulSel.innerHTML=unSelArr.sort().map(val=>`<option>${val}</option>`).join("")`在这里插入代码片`//选中右移var btnRight=document.getElementById('btnRight')btnRight.onclick=function(){for(var i=0;i<ulSel.length;i++){if(ulSel.options[i].selected==true){selArr.push(unSelArr.splice(i,1)[0])selArr.sort()}}ulSel.innerHTML=unSelArr.sort().map(elem=>"<option>"+elem+"</option>").join("");sel.innerHTML=selArr.sort().map(elem=>"<option>"+elem+"</option>").join("");}
</script>

我的思路是:
遍历左边下拉框的选项,当选项被选中,就删除左边下拉框的选项对应的数组中的数据,并将删除的数据添加到右边下拉框选项对应的数组中,最后渲染数组中的数据到页面中。

由于代码没有报错,所以我想着是不是逻辑上出现问题导致出现undefined,在多次的调测下,将问题定位在splice方法上,并且在控制台进行测试
在这里插入图片描述
果然,问题是splice方法,因为splice会删除原数组中的值,这个值被删除以后,后面值的下标索引就向前进了一位,那么后面值的下标索引就变成删除值的下标索引,而对于for循环来说,这个下标索引已经循环过了,所以后面的值会跳出循环。

最后想到了一种简便的方法处理这个问题,就是直接从后向前遍历,那么这个问题就可以避免,代码如下:

<script type="text/javascript">var unSelArr=['中国','美国','俄罗斯','英国','法国'];var selArr=[]var ulSel=document.getElementById('ulSel')var sel=document.getElementById('sel')ulSel.innerHTML=unSelArr.sort().map(val=>`<option>${val}</option>`).join("")`在这里插入代码片`//选中右移var btnRight=document.getElementById('btnRight')btnRight.onclick=function(){for(var i=ulSel.length-1;i>=0;i--){if(ulSel.options[i].selected==true){selArr.push(unSelArr.splice(i,1)[0])selArr.sort()}}ulSel.innerHTML=unSelArr.sort().map(elem=>"<option>"+elem+"</option>").join("");sel.innerHTML=selArr.sort().map(elem=>"<option>"+elem+"</option>").join("");}
</script>![在这里插入图片描述](https://img-blog.csdnimg.cn/1d00c2f4ad1d434ea343f4ea8b569b94.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe939ff4e4e84efea85260cca9e6159d.png)

这篇关于如何解决数组的splice方法在for循环中出现的问题?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382128

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原