过滤功能比较无效 javascript
Comparison on filter function not working javascript
我有一个 javascript 函数,它可以接受两个或更多 arguments.The 第一个参数总是一个数字数组。我需要从数组中删除那些等于其他参数的数字,但我的比较总是 returns 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) );
下面是一个将过滤器与 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[]
数组重新初始化为仅过滤掉最后一个比较值的数组。
如需更正您的方法,请参阅 。
您的匿名函数看到的 arguments
与您的 destroyer
函数看到的 arguments
不同。由于 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
变量,使它们可以从匿名函数访问。
您的代码无法正常工作,部分原因是您正试图 运行 与回调函数 (a) {} 中破坏者的参数 [x] 进行比较,它有自己的参数 [x]。
Javascript 正在将数组元素与 function(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) );
代码中有两处错误,正确的应该是这样:
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
的地方出错了
我有一个 javascript 函数,它可以接受两个或更多 arguments.The 第一个参数总是一个数字数组。我需要从数组中删除那些等于其他参数的数字,但我的比较总是 returns 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) );
下面是一个将过滤器与 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[]
数组重新初始化为仅过滤掉最后一个比较值的数组。
如需更正您的方法,请参阅
您的匿名函数看到的 arguments
与您的 destroyer
函数看到的 arguments
不同。由于 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
变量,使它们可以从匿名函数访问。
您的代码无法正常工作,部分原因是您正试图 运行 与回调函数 (a) {} 中破坏者的参数 [x] 进行比较,它有自己的参数 [x]。
Javascript 正在将数组元素与 function(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) );
代码中有两处错误,正确的应该是这样:
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