js遍历数组时删除元素最终结果不对

摘要:
在Java中,可以使用ConcurrentHashMap或容器迭代器在遍历期间删除元素。当js在遍历数组时删除元素时,需要注意的是,删除后数组将动态变化。你应该调整索引,否则结果将不正确。原始地址:https://blog.csdn.net/luolin2611/article/details/77745586一、当问题描述js使用split删除元素时,它会用以下元素填充被删除元素的索引。vararr=[1,3,4,6,9,17,23,12];安慰日志对于{//如果{arr.splice(i,1);}},则删除大于10的数字安慰日志根据逻辑,应该删除的元素是17、23和12,而只有17和12被删除。在我的业务中,您需要首先进行排序,并在超过指定数量时删除具有相同特征的对象。

  java中遍历时删除元素,可以使用ConcurrentHashMap或者容器的迭代器Iterator来实现。

       js遍历数组时删除元素时,需要注意删除后,数组会动态的变化,要调整索引,否则得到的结果就是不对的。

       原文地址:https://blog.csdn.net/luolin2611/article/details/77745586

      

一、问题描述

  js使用splice删除元素时,会将后面的元素来补填被删掉元素的索引。这样会导致遍历数组删除数组的多个元素时出现隔个索引删除现象。(这样的描述可能有点抽象,用代码说话)。

var arr = [1,3,4,6,9,17,23,12];
console.log("删除前数组:
"+arr);
for(var i=0;i<arr.length;i++){
    //删除大于10的数
    if(arr[i]>10){
        arr.splice(i,1);
    }
}
console.log("删除后数组:
"+arr);

  按照逻辑,应该删除的元素是17、23、12,而只删除了17、12。

      问题分析:便于描述给每个元素加上一个索引在括号内为索引1 (0)、3 (1)、4 (2)、6(3)、9 (4)、17 (5)、23 (6)、12 (7)。

      当删除17的时候,数组的总长度变为7,此时剩下元素和索引情况1 (0)、3(1)、4 (2)、6 (3)、9(4)、23(5)、12(6);而 i 开始执行6了,此时会删除索引为6的元素,即将12删除了,因此删除了17,12。

二、问题解决

  从上面的描述可以看出当删除第一个元素时不会出现问题,当删除处第一个之外的元素时会出现问题,索引总是 i - 1;因此可以使用以下方式解决

for(var i=0;i<arr.length;i++){
    //删除大于10的数
    if(arr[i]>10){
        arr.splice(i--,1);
    }
}

 

      还有一种方式,是用逆向删除方式。

          我的业务中,要先排序,相同特征的对象超过指定个数时再删除。没有使用逆向删除方式,下面列出代码:

function onDelete() {
            var indexs = list.length;
            for (var i = indexs-1; i>=0; i--)
            {
                if ($(list[i]).attr("checked") == true)
                {
                    qtgcs.splice(i, 1);
                }
            }
        }

  

免责声明:文章转载自《js遍历数组时删除元素最终结果不对》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Kafka 数据文件存储-可靠性保证-ISR核心知识Subversion 1.8.1编译安装(self)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

移动端 H5 拍照 从手机选择图片,移动端预览,图片压缩,图片预览,再上传服务器

前言:最近公司的项目在做全网营销,要做非微信浏览器的wap 站 的改版,其中涉及到的一点技术就是采用H5 选择手机相册中的图片,或者拍照,再将获取的图片进行压缩之后上传。 这个功能模块主要有这5点比较难:   1手机获取相册的图片文件,拍照的图片文件,通过js 的自带的img对象,获取图片对象。     2.图片的压缩,采用canvas 画布进行压缩图片,...

JavaScript中创建自定义对象

JavaScript高级培训-自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类、Hashtable类等等。 目前在Javascript中,已经存在一些标准的类,例如Date、Array、RegExp、String、Math、Number等等,这为...

JS 英文不截断单词截取

canRun View Code <html> <head> <title>JS substr</title> <meta http-equiv="Content-Type"content="text/html; charset=utf-8" /> <meta ht...

JS组件系列——封装自己的JS组件

前言:之前分享了那么多bootstrap组件的使用经验,这篇博主打算研究下JS组件的扩展和封装,我们来感受下JQuery为我们提供$.Extend的神奇,看看我们怎么自定义自己的组件,比如我们想扩展一个$("#id").MyJsControl({})做我们自己的组件,我们该如何去做呢,别急,我们慢慢来看看过程。 一、扩展已经存在的组件 1、需求背景 很多时...

js对象中什么是可枚举性(enumerable)?

说到枚举,可能很多人都会想到枚举类型,但在javascript对象中有一个属性为可枚举性,他是什么呢? 概念 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。* for..in循环* Object.keys方法* JSON.s...

js-判断字符串中是否存在emoji表情

1 function isEmojiCharacter(substring) { 2 for(var i = 0; i < substring.length; i++) { 3 var hs = substring.charCodeAt(i); 4...