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指向的内存地址 ,置空等待垃圾回收

 

 

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

 

posted @ 2020-04-16 18:20  海小真  阅读(529)  评论(0编辑  收藏  举报