纯粹的JS来lodash

时间:2015-02-06 23:44:37

标签: javascript angularjs underscore.js lodash

我在这里有一些不同的陈述,我希望你告诉我它们是否相同:

myApp.filter('myFilter', function() {

  var result, i, sport, y, contains, league;
  return function(sports, filterBy) {    
    if (angular.isUndefined(sports) || !filterBy) {
      return sports;
    }

    filterBy = filterBy.toLowerCase();
    result = [],
    contains = function(haystack, needle) {
      return haystack.toLowerCase().indexOf(needle) > -1;
    };

    for (i = 0; i < sports.length; i++) {
      sport = sports[i];
      if (contains(sport.name, filterBy)) {
        result.push(sport);
        continue;
      } else {
        for (y = 0; y < sport.leagues.length; y++) {
          league = sport.leagues[y];
          if (contains(league.name, filterBy)) {
            result.push(sport);
            break;
          }
        }
      }
    }
    return result;
  };
});

现在使用lodash:

myApp.filter('myFilter', function() {

  var result, i, sport, y, contains, league;
  return function(sports, filterBy) {    
    if (angular.isUndefined(sports) || !filterBy) {
      return sports;
    }

    filterBy = filterBy.toLowerCase();
    result = [],
    contains = function(haystack, needle) {
      return haystack.toLowerCase().indexOf(needle) > -1;
    };

  _.each(sports.length, function(sport) {
      if (contains(sport.name, filterBy)) {
        result.push(sport);
        continue;
      } else {
        _.each(sport.leagues.length, function(league) {
          if(contains(league.name, filterBy)) {
            result.push(sport);
            break;
          }
        });
      }
    });

我正试图搞定lodash的逻辑。我在ALMOST纯JS中有这个功能,但是一旦我尝试将其转换为lodash,我的应用程序崩溃了,所以我想知道错误在哪里?

这里我有this Plnkr和纯js函数,在库部分你会看到我有underscore因为我不知道为什么lodash没有加载,所以,所有我正在尝试的是:使用lodash代替_.each

将该函数转换为for loop函数

1 个答案:

答案 0 :(得分:1)

你不会使用&#34;每个&#34;在这种情况下。同样在&#34;每个&#34;你没有得到&#34;继续&#34;或者&#34;打破&#34;。对我来说,我会使用&#34; filter&#34;获得过滤结果。所以代码应该是这样的:

var result = sports.filter(function(sport){
  return (
      contains(sport.name, filterBy) 
    || (
      sport.leagues && sport.leagues.some(function(league) { 
        return contains(league.name, filterBy) 
      })
    )
  )
})

或lodash / underscore

var result = _.filter(sports, function(sport) {
  return (
      contains(sport.name, filterBy) 
    || (
      sport.leagues && _.some(sport.leagues, function(league) { 
        return contains(league.name, filterBy);
      })
    )
  )
});