在JavaScript中使用.filter评估传递的值

时间:2017-02-16 08:36:59

标签: javascript angularjs

我有一个方法,它使用语言缩写并使用.constant字典匹配它,并返回匹配的语言名称。

如何使用.filter进行评估以检查传递的isoCode /语言缩写是否存在?

以下是我的方法:

angular.module('portalDashboardApp')

  .service('ISOtoLanguageService', ['Languages', function(Languages) {

    this.returnLanguage = function(isoCode) {

      var categoryObject = Languages.filter(function ( categoryObject ) {
        return categoryObject.code === isoCode;
      })[0];

      return categoryObject.name;

    };

  }]);

以下是我尝试过捕捉错误的方法:

angular.module('portalDashboardApp')

  .service('ISOtoLanguageService', ['Languages', function(Languages) {

    this.returnLanguage = function(isoCode) {

        var categoryObject = Languages.filter(function (categoryObject) {
            if (isoCode != null || isoCode != undefined) {
                return categoryObject.code === isoCode;
            }
            else {
                return categoryObject.code === 'und';
            }        
      })[0];

      if (categoryObject.name != undefined || categoryObject.name != null) {
          return categoryObject.name;
      }
      else {
          return "undefined";
      }
    };
  }]);

谢谢!

1 个答案:

答案 0 :(得分:1)

我建议您在Languages的对象或地图中整理数据,当您通过缩写获取翻译时,它会更快更简单。一个简短的例子:

angular.module('portalDashboardApp')
  .factory('Languages', function(){
    var dictionary = {
      ISO: {name: 'International Organization for Standardization'}
    };
    return {
       get: function(abbr){
           return dict[abbr];
       }
    };
  }).service('ISOtoLanguageService', ['Languages', function(Languages) {
    this.returnLanguage = function(isoCode) {
       if(!isoCode) {
         return "Answer for empty isoCode";
       }
       var categoryObject = Languages.get(isoCode);
       return (categoryObject || {}).name || "I don't know this abbr";
  };

}]);

我不确定这个JS在没有任何语法错误的情况下工作(我没有尝试启动它)但想法是你不需要数组和filter在大词典上你能够从dict获得任何带有O(1)复杂度的缩写,即使是庞大的字典。

如果您不想对代码进行重构,可以执行以下操作:

angular.module('portalDashboardApp')

  .service('ISOtoLanguageService', ['Languages', function(Languages) {

    this.returnLanguage = function(isoCode) {
        if (!isoCode) {
            return;
        }

        var resultAbbrs = Languages.filter(function (categoryObject) {
            return categoryObject.code === isoCode;
        });

        if (resultAbbrs.length > 0) {
            return resultAbbrs[0].name;
        }
    };
  }]);

在这种情况下,如果isoCode为null,则未定义或空字符串或在字典return undefined中找不到此键将默认为。在外面你应该用if (result === undefined) ...

检查这个功能的结果

我希望它能帮助你)