Seek And Destroy (摧毀函數(shù))

今天被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ù)組。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容