过滤功能不兼容javascript的比较

时间:2015-08-26 02:17:18

标签: javascript arrays function filter arguments

我有一个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) );

4 个答案:

答案 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]

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

  1. 您要访问的arguments对象是传递给过滤器回调函数的arguments对象,而不是传递给destroyer函数的对象。
  2. 在每次迭代中,您将neo[]数组重新初始化为仅过滤掉最后比较值的数组。
  3. 要更正您的方法,请参阅Sebi's solution

答案 1 :(得分:2)

您的匿名函数argumentsarguments函数中的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) );