题目描述

移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组

示例

输入:
[1, 2, 3, 4, 2], 2

输出:
[1, 3, 4]

个人思路

题目要求需要不直接修改原数组,所以需要复制一个新数组,再使用splice函数删除与item相同的项。
所以我得到的代码如下:

function remove(arr,item){
    var newarr = arr;
    for(var i=0;i<newarr.length;i++){
        if(newarr[i] == item){
            newarr.splice(i,1);
        }
    }
    return newarr;
}

但是实际上这个代码并没有通过测试,经过检查发现了如下的错误:

  1. 数组不是基本数据类型,而是一个引用数据类型或者叫做复杂数据类型,此类型的变量存的不是数据本身,存的是指向堆内存中的地址,直接赋值后实际上newarr和arr是指向同一个数组,不符合题目要求:不直接修改数组arr。
  2. 使用splice函数后,数组的长度会少一,整体内容会向左移,如果数组内有连续相同的元素,会漏掉最后一个元素不能被移除。
    所以修改后的代码如下:
function remove(arr,item){
    var newarr = arr.slice(0);
    for(var i=0;i<newarr.length;i++){
        if(newarr[i] == item){
            newarr.splice(i,1);
            i--;
        }
    }
    return newarr;
}

这样就可以通过测试了。但是实际上方法不止一个,下面给出其它方法:

其它方法

function remove(arr,item){
    var newarr = [];
    for(var i=0;i<arr.length;i++){
        if(arr[i] != item){
            newarr.push(arr[i]);
        }
    }
    return newarr;
}

这个方法和我想的是一类,新建一个新数组,把不同的元素添加进去


function remove(arr,item){
    return arr.filter(function(ele){
         return ele != item;
    })
}

filter()函数是用于筛选数组用的,函数是这样工作的:filter()函数可以接收一个参数,这个参数是一个回调函数,filter函数会把数组中的每个元素作用于回调函数,作用之后如果回调返回值是false就丢弃这个元素,如果是true就保留这个元素,然后依次对数组的每个元素都执行这个操作。
所以上述代码:如果数组元素与item不等就返回true,保留元素;否则返回false,丢弃元素。


如果本文有帮助到你,可以给站长打赏一杯下午茶