2017-01-23 31 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; 
}