我有一个javascript函数,它可以带两个或更多个参数。第一个参数总是一个数组。我需要从数组中删除那些与其他参数相等的数字,但我的比较总是返回false
function destroyer(arr) {
var neo=[];
for(x=1;x<arguments.length;x++){
neo =arr.filter(function(a){
return a!=arguments[x] ;
});
}
return neo;
}
document.write( destroyer( [1, 2, 3, 1, 2, 3], 2, 3) );
答案 0 :(得分:4)
这是一个将过滤器与indexOf()
方法结合使用的实现:
function destroyer(arr) {
var args = Array.prototype.slice.call(arguments, 1);
return arr.filter(function(i) {
return args.indexOf(i) < 0;
});
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); // prints [1,1]
至于为什么你的原始解决方案不起作用,有两个因素在起作用:
arguments
对象是传递给过滤器回调函数的arguments
对象,而不是传递给destroyer
函数的对象。neo[]
数组重新初始化为仅过滤掉最后比较值的数组。要更正您的方法,请参阅Sebi's solution。
答案 1 :(得分:2)
您的匿名函数arguments
与arguments
函数中的destroyer
不一样。由于arr.filter
会调用您的回调函数,因此会获得新的参数。
以下修复了代码,请参阅Robby关于替代方法的答案。
function destroyer(arr) {
var args = arguments;
return arr.filter(function(a) {
for(var x = 1; x < args.length; x++) {
if(args[x] == a) {
return false;
}
}
return true;
});
}
它将您的外部函数的参数分配给args
变量,使它们可以从匿名函数访问。
答案 2 :(得分:1)
代码中有两个错误,正确的是这个:
function destroyer(arr) {
var arg = arguments;
for(x=1;x<arguments.length;x++){
arr =arr.filter(function(a){
return a!=arg[x] ; //arguments change here
});
}
return arr;
}
(1)arguments
已在第二个函数中更改。您需要在关闭中保存先前的arguments
。
(2)变量neo
在第二个循环中保持不变,因为arr
保持不变。由于arr
用作队列,如果您不希望更改arr,则可以传递像arr.concat()
我想继续说,这是在浏览器的调试模式中找到错误的好方法。当您使用断点来遵循该过程时,您会发现在第二个arguments
答案 3 :(得分:0)
你的代码部分无效,因为你试图在回调函数(a){}中与驱逐者的参数[x]进行比较,后者有自己的参数[x]。
Javascript将数组元素与函数(a){}的参数进行比较。
function destroyer(arr) {
var neo=[];
for(x=1;x<arguments.length;x++){
neo =arr.filter(function(a){
return a!=arguments[x] ;
});
}
return neo;
}
document.write( destroyer( [1, 2, 3, 1, 2, 3], 2, 3) );