题目描述
移除数组 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;
}
但是实际上这个代码并没有通过测试,经过检查发现了如下的错误:
- 数组不是基本数据类型,而是一个引用数据类型或者叫做复杂数据类型,此类型的变量存的不是数据本身,存的是指向堆内存中的地址,直接赋值后实际上newarr和arr是指向同一个数组,不符合题目要求:不直接修改数组arr。
- 使用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,丢弃元素。
2 评论