zoukankan      html  css  js  c++  java
  • js数组的遍历方法,维持索引?splice与forEach && 孤儿对象形成,造成内存泄漏,置空等待垃圾回收

    今天突发奇想,在数组里面,我想删除某个值,想通过arr.forEach()方法遍历,遇到符合条件的,就arr.splice(index,1)删掉,但我发现,有问题,

    如果,符合条件的两个元素放在一起,遍历方法就不能维持索引,都删掉了。

    如果符合条件的分散开,就像下面这样,就能够把不想要的元素删除:

        var arr1=["1",2,3,5,"1"];
        console.log("原arr1",arr1);
        arr1.forEach(function(item,index){
            if(item ==="1") arr1.splice(index,1);
        })
        console.log("现arr1",arr1);

     如果,符合条件的多个相邻,就会出问题:

        var arr=["1",2,3,"1","1","1",5,1,"1","1","1","1","1"];
        console.log("原arr",arr);
        arr.forEach(function(item,index){
            if(item ==="1") arr.splice(index,1);
        })
        console.log("现arr",arr);
    

    可以用delete来实现这个功能:

    小妙招:比如delete obj.a,主要用于删除对象的属性,也可以删值,但是会留下empty,维持索引

            var arr = ["1", 2, 3, "1", "1", "1", 5, 1, "1", "1", "1", "1", "1"];
            console.log("原arr", arr);
            arr.forEach(function (item, index) {
                if (item === "1") delete arr[index];
            })
            console.log("中arr", arr);
            let arr1 = [];
            for(let i in arr){
                arr1.push(arr[i]);
            }
            arr = arr1;
            console.log("现arr", arr);

    或者用 Object.values(arr)来实现:

        var arr = ["1", 2, 3, "1", "1", "1", 5, 1, "1", "1", "1", "1", "1"];
        console.log("原arr", arr);
        arr.forEach(function (item, index) {
            if (item === "1") delete arr[index];
        })
        arr = Object.values(arr)
        console.log(arr);
    

     大师兄说,上面的代码还可以简化为:

    不过,Object.values(arr)返回新数组,再赋给arr,可能会有孤儿对象形成,造成内存泄漏,

    如果非要这么较真儿,你可以添上下面的内容:

    var arr1 = arr; arr= objeckeys... ; arr1 = null;

    先暂存一下,存引用,指向arr,arr重新赋值,再删除原来arr指向的内存地址 ,置空等待垃圾回收

     至于为什么会有维持索引的问题,不知道,如果幸运的话,望哪位仁兄看到能解答一下,嘿嘿。

  • 相关阅读:
    C#托盘图标
    线程相关整理
    Quartz.NET 快速入门
    (转)IE内存泄露,iframe内存泄露造成的原因和解决方案
    美化console.log的文本(转载)
    mongoDB学习资料整理
    EF7学习资料整理
    Oracle常用
    Node.js学习资料整理
    【大型网站技术实践】初级篇:借助Nginx搭建反向代理服务器(转)
  • 原文地址:https://www.cnblogs.com/miniSkytrue/p/12714789.html
Copyright © 2011-2022 走看看