【问题标题】:How do I iterate through these arguments to filter an array?如何遍历这些参数来过滤数组?
【发布时间】:2015-12-21 07:53:40
【问题描述】:

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

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);

这里离我需要去的地方很近吗?还是离这里很远?

【问题讨论】:

    标签: javascript arrays filter callback arguments


    【解决方案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 对象从函数中传递出去会很难优化。

    【讨论】:

    • 谢谢我得到了这个版本。显着的变化是将参数推送到 badValues 并将过滤器函数设置为测试索引 === -1。
    • @slurrr 是的,对不起,我的测试倒退了 :) 很高兴你成功了!
    猜你喜欢
    • 2020-11-03
    • 2014-02-07
    • 2021-03-23
    • 1970-01-01
    • 2022-11-18
    • 2020-07-19
    • 1970-01-01
    • 2021-07-23
    • 2021-04-08
    相关资源
    最近更新 更多