如何迭代这些参数来过滤数组?

时间:2015-09-23 20:37:38

标签: javascript arrays filter callback arguments

所以我有这个代码,它做了它需要做的事情,它返回一个输入数组减去与数组后面的参数匹配的任何值。但是,我无法弄清楚如何遍历所有参数。这是我的工作 -

function destroyer(arr) {
  var arg2 = arguments[1];
  var arg3 = arguments[2];
  var arg4 = arguments[3];
  var result = arr.filter(function(arg) {
    if (arg != arg2 && arg != arg3 && arg != arg4) {
      return (arg);
    }
  });
  return result;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

这是我尝试使用for循环迭代所有参数。它无法正常工作,我正在努力构思我在arr.filter中回调我的回调 -

function destroyer(arr) {
  var result = arr.filter(function(arg) {
    for (var i = 1; i < arguments.length; i++) {
      if (arg != arguments[i]) {
        return (arg);
      }
    }
  });
  return result;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

这是否接近我需要的地方或离开这里?

1 个答案:

答案 0 :(得分:1)

在每个函数调用上设置arguments变量,包括对.filter()回调的调用。因此,回调中的arguments不是您认为的那样。

您可以执行.indexOf尝试执行的操作,并且您需要将他们的参数复制到另一个数组中:

function destroyer(arr) {
  var badValues = [];
  for (var i = 1; i < arguments.length; ++i)
    badValues = arguments[i];
  return arr.filter(function(value) {
    return badValues.indexOf(value) < 0;
  });
}

使用.slice()复制全部或部分arguments对象很受欢迎:

  var badValues = [].slice.call(arguments, 1);

如果您喜欢简洁,可以这样做,但是将arguments对象从函数中传递出来会使优化非常困难。