【问题标题】:How do you use a for loop inside of the callback function of the filter method?如何在过滤器方法的回调函数中使用 for 循环?
【发布时间】:2015-07-22 19:26:54
【问题描述】:

此代码返回正确的数组,但我在 arrayFilter 函数内部作弊。通过使用matchItem[0]matchItem[1],我对仅使用2 个过滤器项进行了硬编码。如果少于 2 个,则测试失败,如果超过 2 个,则不会过滤掉多余的项。

function destroyer(arr) {
  // Remove all the values
  var destroyerArgsAmount = arguments.length;
  var matchArr = arguments[0];       
  var newArr = [];

  var matchItems = []; 
  for(i = 1; i < destroyerArgsAmount; i++) {
    matchItems.push(arr[i]);
  }

  function arrayFilter(val) {
    if(val != matchItems[0] && val != matchItems[1]) {
      return true;
    }
  }
  arr = matchArr.filter(arrayFilter);      
  return arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

为什么 for 循环在这种情况下不起作用?

for(i = 0; i < matchItems.length; i++) {      
      if(matchItems[i] != value) {
        return value;
      }

这个循环在放入arrayFilter函数时不起作用

有人可以向我解释为什么,然后让我走上正确的道路吗?我认为这将是一件重要的事情,因为有很多方法采用这种方式,例如:filter、map、forEach 以及更多我还不知道的方法。

【问题讨论】:

  • 这实际上很令人困惑,您是否要过滤传入的第一个数组,如果是,为什么要使用其中的值作为过滤器,而不是第二个和第三个参数?跨度>
  • @adeneo 将您的原始答案备份。我的所有代码下方都有一个我没有看到的返回语句。你是第一个而且是正确的,所以我给你一张支票。
  • 你确定你不是在找这个 -> jsfiddle.net/asdkzf98
  • 如果valuematchItems 中的any 元素不同,您的for 循环返回true,但如果value 不同,您的第一个版本返回true来自matchItems中的所有元素。

标签: javascript arrays methods


【解决方案1】:

我不确定你想要达到的结果,因为你没有解释它,但是,我从你的代码中假设你的函数正在尝试 filter 在第一个参数 @987654322 之后传递的所有参数@。像这样:

function destroyer (arr) {
  // You can use slice to grab all arguments after the first index in arguments
  var args = Array.prototype.slice.call(arguments, 1);

  return arr.filter(function (item) {
    // filter anything not found in the arguments list
    // indexOf will return -1 if not found
    return args.indexOf(item) < 0;
  });
}

【讨论】:

    【解决方案2】:

    您似乎需要一种检查值是否在数组中的方法。

    正如@adeneo 所说,如果val 是一个原始值(字符串、数字等)或应该通过引用进行比较的对象,则解决方案很简单

    matchItems.indexOf(val) 
    

    如果valmatchItems-1 中的项目之一,则返回正数(索引)。


    如果您的用例稍微复杂一些,例如如果 matchItems 包含对象,并且您想查看其中是否包含具有特定属性的对象,则可以使用Array.prototype.some

    var found = matchItems.some(function(item){
      return item === val; // use the apropriate comparison here
    });
    

    您的完整代码是:

    function destroyer(arr) {
      var matchItems = Array.prototype.slice.call(arguments, 1);
      return arr.filter(function(a) {
        return !matchItems.some(function(b){
          return a === b;
        });
      });
    }
    
    destroyer([1, 2, 3, 1, 2, 3], 2, 3);
    

    【讨论】:

    • 我不介意投反对票,但附上解释原因的评论会更有用。
    • 我投了你一票。不知道为什么有人投了反对票。感谢您的解释。
    • @Dominofoe 可能是因为初始版本过滤了错误的元素。没有评论,我永远不会知道。
    【解决方案3】:

    使用 indexOf 并返回结果

    function arrayFilter(val) {
       return matchItems.indexOf(val) === -1;
    }
    

    我想也许你正在寻找类似的东西

    function destroyer() {
        var args     = [].slice.call(arguments),
            matchArr = args.shift();
    
        return matchArr.filter(function(item) {
            return args.every(function(item2) {
                return item !== item2;
            });
        });
    }
    

    FIDDLE

    【讨论】:

    • 我确信有很多方法,但我不想将我的代码更改为我不理解的东西。我的代码 = 初学者级别 感谢indexOf 我现在将阅读它。
    【解决方案4】:

    我也在做免费代码营的挑战!这段代码通过了挑战:

    function destroyer(arr) {
        var arr = arguments[0];
          for (var i = 0; i < arr.length; i++) {
            for (var j = 1; j < arguments.length; j++) {
              if (arr[i] === arguments[j]) {
                arr.splice(i, 1);
                i--;
              } 
            }
          }
        return arr;
    }
    
    destroyer([1, 2, 3, 1, 2, 3], 2, 3);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多