今天被fcc上的一個摧毀函數(shù)難住了,反復(fù)思考并調(diào)試了一個多小時才得以實現(xiàn)。
摧毀函數(shù)destroyer(arr,argument1,argument2,argument3,...),
其形參個數(shù)不確定,確定的是,它第一個形參是一個數(shù)組,然后其他的形參是一些值,我們的目的是要摧毀掉數(shù)組中等于其他形參的元素,最終返回一個新數(shù)組。
給定的參考方法是arr.filter(),和arguments對象;arr.filter()用于創(chuàng)建篩選后的新數(shù)組,arguments對象用于確定destroyer函數(shù)的形參個數(shù)(arguments.length,要在指定的函數(shù)內(nèi)使用)。
首先想到的實現(xiàn)思路是:
arr.filter(function(element){
return argumentsArr.indexOf(element)==-1;
})
argumentsArr是什么呢?是形參中要摧毀的值,這個可以通過一個for循環(huán)來得到:
因為我們要得到一個數(shù)組,首先我們先聲明一個數(shù)組,一個空數(shù)組,以便我們往里面push新元素,
var argumentsArr = [ ];
因為我們的新數(shù)組要從第二個形參開始,所以新數(shù)組的長度應(yīng)該是arguments.length-1,
所以for循環(huán)應(yīng)該寫為:
for(i=0;i<arguments.length-1;i++){
argumentsArr.push(arguments[i+1]);//從第二項開始push,所以為i+1。
}
這時我們得到了新數(shù)組argumentsArr;
然后再來回顧第一步中的思路,缺少的argumentsArr變量已經(jīng)得到,整個的題目也就得解了。
整個題目的代碼如下:
function destroyer(arr){
var argumentsArr = [ ];
for(var i=0;i<arguments.length-1;i++){
argumentsArr.push(arguments[i+1]);
}
arr = arr.filter(function(element){
return argumentsArr.indexOf(element) == -1;
})
return arr;
}
那么我遇到的問題有哪些呢?為什么我在明白解題思路后幾分鐘就可以寫好的代碼,卻花了一個多小時的時間去調(diào)試呢?
之前我是這么寫的:
for(i=0;i<argumentsArr.length;i++){
arr.filter(function(argumentsArr[i]){
return arr.indexOf(argumentsArr[i]) == -1;
})
}
很顯然,我之前把filter方法調(diào)用的函數(shù)的形參想象成argumentsArr中的元素了,而且還用了一個for循環(huán),而且fcc中的編輯環(huán)境還一直提醒說for循環(huán)中不能有函數(shù),實際上還是對filter函數(shù)理解不深不徹底,導(dǎo)致了對filter方法的錯誤理解。
其實arr.filter方法本身自帶循環(huán),它自己會使用我們給定的函數(shù)來測試數(shù)組中的所有元素,并創(chuàng)建(即返回)一個包含所有通過測試的元素的新數(shù)組(注意它并沒有改變原數(shù)組)。
簡單總結(jié)filter方法:
1,遍歷數(shù)組中的元素
2,函數(shù)測試,檢查return是否等于true;
3,返回一個包含所有通過測試的元素的新數(shù)組。