2017-01-23 64 views
1

的任务是:Array.Filter不更新阵列

你将被提供一个初始阵列(在 破坏者函数的第一个参数),随后是一个或多个参数。从初始数组中删除所有与这些 参数值相同的 元素。

,同时通过它的工作,我发现了一些Array.filter行为,我努力理解:

function destroyer(arr) { 
    for (var i = 1; i<arguments.length; i++){ 
    toDelete = arguments[i]; 
    arr.filter(isItIn); 
    } 
    return arr; 
} 

function isItIn(item, undefined, array){ 
    return item!=toDelete; 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

我在这里的意图是通过对参数项1+迭代,调用每个时间arr.filterArr.filter然后调用isItIn它检查当前检查的项目是否是我正在搜索的项目。但是,arr正在返回原样。当我改变isItIn到:

function isItIn(item, undefined, array){ 
    return item==1; 
} 

测试,它仍然是不变的,但是console.log S IN的isItIn原来的写作表明它正在正确接收的参数(或者只要我想,以确定至少,

请注意,我已经解决了通过其他途径的问题,我不是在寻找一个解决问题的办法,仅仅是在我的初始码时出现错误的解释。

回答

4

基本上你使用Array#filter并省略其结果

您需要将过滤器的结果分配给前一个数组。

arr = arr.filter(isItIn); 

function destroyer(arr) { 
 
    for (var i = 1; i < arguments.length; i++) { 
 
     toDelete = arguments[i]; 
 
     arr = arr.filter(isItIn); 
 
    } 
 
    return arr; 
 
} 
 

 
function isItIn(item) { 
 
    return item != toDelete; 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

+1

哦,我...如果你有任何想法,我已经多久在那盯着, – MrB

0

你必须返回数组分配:

function destroyer(arr) { 
    for (var i = 1; i<arguments.length; i++) { 
     toDelete = arguments[i]; 
     arr = arr.filter(isItIn); 
    } 
    return arr; 
}