2015-09-23 34 views
0

所以我有這個代碼,它做它需要做的,它返回一個輸入數組減去任何與數組後面的參數相匹配的值。但是,我無法弄清楚如何迭代所有參數。這裏是我的工作 -如何迭代這些參數來過濾數組?

function destroyer(arr) { 
    var arg2 = arguments[1]; 
    var arg3 = arguments[2]; 
    var arg4 = arguments[3]; 
    var result = arr.filter(function(arg) { 
    if (arg != arg2 && arg != arg3 && arg != arg4) { 
     return (arg); 
    } 
    }); 
    return result; 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

這裏是我嘗試迭代所有參數與for循環。它不工作,我努力概念化正是我通過我在這裏arr.filter回調抽 -

function destroyer(arr) { 
    var result = arr.filter(function(arg) { 
    for (var i = 1; i < arguments.length; i++) { 
     if (arg != arguments[i]) { 
     return (arg); 
     } 
    } 
    }); 
    return result; 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

這是接近的地方,我需要還是我在這裏下車呢?

回答

1

對每個函數調用都設置了arguments變量,包括調用.filter()回調函數。因此在回調中的arguments不是你認爲的那樣。

你可以做你試圖用.indexOf做什麼,你需要他們的論點複製到另一個陣列:

function destroyer(arr) { 
    var badValues = []; 
    for (var i = 1; i < arguments.length; ++i) 
    badValues = arguments[i]; 
    return arr.filter(function(value) { 
    return badValues.indexOf(value) < 0; 
    }); 
} 

這是流行使用.slice()複製arguments的全部或部分對象:

var badValues = [].slice.call(arguments, 1); 

你可以做,如果你喜歡的簡潔,但經過arguments對象了功能使得它很難優化。

+0

謝謝我得到了這個工作的版本。值得注意的變化是將參數推送到badValues並設置過濾函數來測試索引=== -1。 – slurrr

+1

@slurrr對不起,我得到了測試:)很高興你成功了! – Pointy