2017-02-25 45 views
1

這是我必須做的:使用篩選器方法從數組中移除元素。

將會爲您提供一個初始陣列(在 驅逐艦函數的第一個參數),然後是一個或多個參數。從初始數組中刪除所有與這些 參數值相同的 元素。

我的代碼:

function destroyer(arr) { 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== arguments[i]; 
    } 
    return x; 
} 

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

但它不能正常工作,並返回初始數組沒有過濾的一個。我的錯誤在哪裏?

回答

3

基本上,你有兩個問題,

  • 在錯誤的內容arguments[i],在過濾器功能的回調,

    function destroyer(arr) { 
        function filterer(val) { // <--------------------+ 
         return val !== arguments[i]; //    | 
         //    ^^^^^^^^^^^^ this points to --+ 
        } 
        for(i=1; i < arguments.length; i++) { 
         x = arr.filter(filterer); 
        } 
        return x; 
    } 
    
  • 沒有的分配導致進一步過濾。

  • 採取的功能與閉合在測試值,並返回的功能在過濾器的方法進一步測試。

  • 使用變量arr作爲起始值並指定過濾結果。然後在最後返回這個值。

function destroyer(arr) {   
 
    function filterer(testValue) {    // take arguments[i] value 
 
     return function (val) {     // return function as callback 
 
      return val !== testValue;   // use testValue instead of arguments[i] 
 
     } 
 
    } 
 

 
    var x = arr         // assign arr as start value for filtering 
 
    for (var i = 1; i < arguments.length; i++) { 
 
     x = x.filter(filterer(arguments[i])); // use filterer with a parameter 
 
    } 
 
    return x;         // return result 
 
} 
 

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

+1

變種X = arr.slice(0)效果會更好,以便不改變輸入數組 – pranavjindal999

+1

@PranavJindal'filter'是一個純粹的功能,並且不改變它被要求的陣列。使用'slice'是不必要的,只會將另一個數組創建添加到此方法的開銷中。 – gyre

+0

@gyre過濾器不會但'''x = x.filter(filterer(arguments [i])); ''' – pranavjindal999

1

arguments範圍發生變化。

想在function filterer(val) {return val !== arguments[i];}中使用arguments[i],因爲它是父函數的參數,它是destroyer

如果是這樣,請使用filterer作爲箭頭功能以保持範圍arguments

function destroyer(arr) { 
    const filterer = (val) => { // ⚠️ This is an arrow function 
    return val !== arguments[i]; // ⬅️ "arguments" refers now to "destroyer()" args 
    } 
    for(i=1; i < arguments.length; i++) { 
    x = arr.filter(filterer); 
    } 


    return x; 
} 

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

使參數對象的副本。正如Abdennour所說,爭論的範圍反映了過濾器的變化。

此外,使輸入數組的副本,並繼續從該數組過濾..否則,你的結果將被過濾的最後一個參數。

function destroyer(arr) { 
var copy = arguments; 
var x = arr; 
    for(i=1; i < copy.length; i++) { 
    x = x.filter(filterer); 
    } 

    function filterer(val) { 
    return val !== copy[i]; 
    } 
    return x; 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
相關問題