过滤功能比较无效 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]

至于为什么您的原始解决方案不起作用,有两个因素在起作用:

  1. 您正在访问的 arguments 对象是传递给过滤器回调函数的 arguments 对象,而不是传递给您的 destroyer 函数的对象。
  2. 在每次迭代中,您都将 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

的地方出错了