美文网首页Web前端之路让前端飞技术文
循环删除数组元素的几种姿势

循环删除数组元素的几种姿势

作者: 梦中人在梦中 | 来源:发表于2017-04-07 14:00 被阅读165次

问题

在码代码的过程中,经常会遇到在循环中移除指定元素的需求。按照常规的思路,直接一个for循环,然后在循环里面来个if判断,在判断中删除掉指定元素即可。但是实际情况往往不会像预想的那样顺利运行。下面以一段Javascript代码为例演示这一过程。

    (function () {
        var arr = [1,2,2,3,4,5];
        var len = arr.length;
        for(var i=0;i<len;i++){
            //打印数组中的情况,便于跟踪数组中数据的变化
            console.log(i+"="+arr[i]);
            //删除掉所有为2的元素
            if(arr[i]==2){
                arr.splice(i,1);
            }
        }
        console.log(arr);
    })();

运行结果如下:

从最终的结果可以看到实际上只删除掉了匹配的其中一个元素,而另外一个元素还存在。

从打印出的运行过程不难发现,原因为当删除掉了一个元素后,数组的索引发生的变化,造成了程序的异常。

解决

找到了问题的原因,就不难解决问题了。

姿势一

    (function () {
        var arr = [1,2,2,3,4,5];
        var len = arr.length;
        for(var i=0;i<len;i++){
            //打印数组中的情况,便于跟踪数组中数据的变化
            console.log(i+"="+arr[i]);
            //删除掉所有为2的元素
            if(arr[i]==2){
                //注意对比这行代码:删除元素后调整i的值
                arr.splice(i--,1);
            }
        }
        console.log(arr);
    })();

上面的代码看起来不大好理解,有没有看起来更易于理解的代码呢?请看下面

姿势二

    (function () {
        var arr = [1,2,2,3,4,5];
        var len = arr.length-1;
        //start from the top
        for(var i=len;i>=0;i--){
            console.log(i+"="+arr[i]);
            if(arr[i]==2){
                arr.splice(i,1);
            }
        }
        console.log(arr);
    })();

从后往前遍历可以有效解决问题,也容易理解,那么还有没有跟简洁的实现呢?接着看下面代码

姿势三

    (function () {
        var arr = [1,2,2,3,4,5];
        var i = arr.length;
        while(i--){
            console.log(i+"="+arr[i]);
            if(arr[i]==2){
                arr.splice(i,1);
            }
        }
        console.log(arr);
    })();

使用while(i--),i为数组下标,个人觉得这是最简洁、高效的代码实现了。

相关文章

  • 循环删除数组元素的几种姿势

    问题 在码代码的过程中,经常会遇到在循环中移除指定元素的需求。按照常规的思路,直接一个for循环,然后在循环里面来...

  • Js中循环删除数组元素

    JavaScript里在for循环里splice删除数组指定元素的注意事项:需要删除多个元素时,在for循环里直接...

  • js 数组操作

    遍历删除元素: 遍历数组:for循环遍历: forEach遍历:

  • 原生JS,通过classs删除元素

    采坑: 如果上面的 For 循环是正向循环会删除不掉所以有该 class 的元素。因为删除一个元素后dom数组长度...

  • Swift数组和字典

    数组的创建 数组的访问和查找 数组的编辑 Swift数组提供了几种remove方法,用来删除数组中的元素 数组排序...

  • Swift 数组删除元素

    Swift 数组里提供了删除数组元素的方法主要包括以下几种: 1、@inlinable public mutati...

  • for循环数组删除多项元素

    for (expr1; expr2; expr3){statement}第一个表示式只在循环开始前执行一次并且无条...

  • oc中for in循环删除数组元素报错

    oc中的for in 循环中,操作删除数组元素会报错. 原因: 因为for in语法在执行循环的时候是遍历整个数组...

  • Swift 数组删除元素

    Swift 数组里提供了删除数组元素的方法主要包括以下几种: remove(at index: Int)示例 Sw...

  • leetcode-探索初级算法-2019-10-14

    排序数组中删除重复元素 双层for循环 + splice The simplest approach (in m...

网友评论

    本文标题:循环删除数组元素的几种姿势

    本文链接:https://www.haomeiwen.com/subject/qudhattx.html