我试图在数组上使用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]
我在网上找到了一些解决这个问题的可能方法的例子,但它们与我所理解的完全不同。有没有办法让我的工作,甚至理解为什么没有调用参数数组的其他元素。
答案 0 :(得分:2)
如果您使用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));
&#13;
根据你的逻辑,你可以这样做。如果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);
&#13;
答案 1 :(得分:0)
因为使用您的代码,您总是测试过滤器中的当前元素是否等于或等于函数中的第二个参数,即2并返回true / false。相反,您可以使用indexOf
来测试过滤器中的当前元素是否在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);
&#13;
答案 2 :(得分:0)
问题在于你的这一行
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);