題目
金克斯的迫擊炮!
實現一個摧毀(destroyer)函數,第一個參數是待摧毀的數組,其余的參數是待摧毀的值。
提示
思路
函數中的有隱式的不確定個數的參數,而我們在函數中將會用到它,很顯然,這需要我們在 arguments
上做文章了。我們來看看MDN是怎么解釋 arguments
的:
arguments 是一個類數組對象。代表傳給一個function的參數列表。
很顯然,既然是類數組對象,說明它不是真正的數組,沒有數組所具有的屬性和方法(除了 length
屬性)。為了便於我們接下來的運算,我們需要把arr后面的待摧毀的所有參數放進一個數組:
var args = [];
for(var i = 1; i < arguments.length; i++){ args.push(arguments[i]); }
拿到了待摧毀的項構成的數組,接下來就是用 filter()
方法實現的簡單的去重操作了。
arr.filter(function(item,index,array){ return args.indexOf(item) < 0; });
因為 filter()
不會改變原始數組,所以聲明一個變量接收上一步的返回結果,最后整個函數返回這個變量,問題解決啦!
解法
function destroyer(arr) { // Remove all the values var args = []; for(var i = 1; i < arguments.length; i++){ args.push(arguments[i]); } var temp = arr.filter(function(item,index,array){ return args.indexOf(item) < 0; }); return temp; }
測試
destroyer([1, 2, 3, 1, 2, 3], 2, 3)
應該返回 [1, 1]
.
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3)
應該返回 [1, 5, 1]
.
destroyer([3, 5, 1, 2, 2], 2, 3, 5)
應該返回 [1]
.
destroyer([2, 3, 2, 3], 2, 3)
應該返回 []
.
destroyer(["tree", "hamburger", 53], "tree", 53)
應該返回 ["hamburger"]
.