在下面的代码中,我预计destroyer([1, 2, 3, 1, 2, 3], 2, 3);
的结果为[1,1]
。
但结果会弹出[1,2,3,1,2,3]
。
我哪里错了?
function destroyer(arr) {
function hlp(x) {
for(var i=1; i<arguments.length ; i++) {
if(x == arguments[i]) return false;
}
return true;
}
return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
答案 0 :(得分:0)
你已经定义destroyer
只接受一个参数,而你传递的不止一个。 arguments
未定义,并且在传递给Array.filter()
的函数中迭代不是一个好主意。 Array.filter()
为您检查每个元素。并不是说它可以在您的代码中使用,但如果可以的话,最好只返回x == arguments[i]
而不是检查它是true
还是false
。如果你返回x == arguments[i]
,你实际上是返回一个布尔值。这方面的一个例子是我在return exclude.indexOf(i) == -1;
下面的代码中的位置。请尝试以下方法:
function destroyer(arr, exclude) {
return arr.filter(function(i) {
return exclude.indexOf(i) == -1;
});
}
console.log(destroyer([1, 2, 3, 1, 2, 3], [2, 3]));
答案 1 :(得分:0)
您可以使用ES6 rest parameter syntax
并使用include()
检查数组是否包含任何参数
function destroyer(arr, ...rest) {
function hlp(e) {
return !rest.includes(e)
}
return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
如果您想使用for
循环和arguments
,您的代码应如下所示。
function destroyer(arr) {
var arg = arguments
function hlp(x) {
for (var i = 1; i < arg.length; i++) {
if (x == arg[i]) return false;
}
return true;
}
return arg[0].filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
答案 2 :(得分:0)
解决方法有两种:
第一
function destroyer(arr) {
function hlp(x) {
for(var i=1; i<destroyer.arguments.length ; i++) {
if(x == destroyer.arguments[i]) return false;
}
return true;
}
return arr.filter(hlp);
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
第二
查看@Nenad Vracar发布的解决方案