[英]JavaScript - filter through an array with arguments using for loop
我試圖在數組上使用filter方法基於可變數量的參數遍歷數組。
以下是我對此的嘗試:
function destroyer(arr) {
var argArr = arr.slice.call(arguments, 1);
var filteredArray = arr.filter(function(val) {
for (var i = 0; i < argArr.length; i++) {
return val != argArr[i];
};
});
console.log(filteredArray);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
當我這樣做時,僅處理arguments數組的第一個元素。 因此,這將返回:
[1, 3, 1, 3]
我在網上找到了一些解決此問題的可能方法的示例,但它們與我目前所了解的完全不同。 有什么方法可以使我的工作,甚至可以理解為什么不調用arguments數組的其他元素。
如果使用ES6
,則可以使用rest運算符和Array#includes函數來實現
function destroyer(arr, ...params){ return arr.filter(item => !params.includes(item)); } console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
按照您的邏輯,您可以這樣做。 如果val
等於當前argArr's
項目,則return false
,如果在循環后未找到任何內容: return true
function destroyer(arr) { var argArr = Array.prototype.slice.call(arguments, 1); var filteredArray = arr.filter(function(val) { for (var i = 0; i < argArr.length; i++) { if(val === argArr[i]){ return false; } }; return true; }); console.log(filteredArray); } destroyer([1, 2, 3, 1, 2, 3], 2, 3);
因為使用您的代碼,您始終會測試過濾器中的當前元素是否等於或不等於函數中的第二個參數2,然后返回true / false。 相反,您可以使用indexOf
來測試filter中的當前元素是否在arguments數組內部。
function destroyer(arr) { var argArr = arr.slice.call(arguments, 1); var filteredArray = arr.filter(function(val) { return argArr.indexOf(val) == -1 }); console.log(filteredArray); } destroyer([1, 2, 3, 1, 2, 3], 2, 3);
問題是您的這一行return val != argArr[i];
這樣改變邏輯,也將避免做額外的循環。
function destroyer(arr) {
var argArr = arr.slice.call(arguments, 1); debugger
var filteredArray = arr.filter(function(val) {
return !(argArr.indexOf(val) >= 0);
});
console.log(filteredArray);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.