2017-02-16 32 views
1

我有一种方法需要一种语言缩写并使用.constant字典将其匹配,并返回匹配的语言名称。在JavaScript中使用.filter评估传递的值

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

这里是我的方法:

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"; 
     } 
    }; 
    }]); 

谢谢!

+0

'Languages'为您服务,词典或任何外部? – Antonio

+1

焦虑问题:在JavaScript中“isoCode!= undefined”和“isoCode!= null”两者完全相同。所以你可以安全地放弃其中一个。这只适用于!=而不适用于!== –

+0

@Antonio它是一个内部.constant字典。 – onmyway

回答

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即使使用巨大的字典,您也可以从字典中获得任何缩写以及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) ...

我希望它帮你)

+0

感谢您的意见和反馈,并提出了很好的建议。但是,有没有办法让我用我的代码按原样对'.filter'进行评估? – onmyway

+0

@onmyway我改变了我的答案,请尝试 – Antonio

+0

谢谢,作品像一个魅力。此外,只是一个供参考;虽然我把我的语言字典设置为.constant字典,并且我使用上面所示的方法,将1000条记录的文件导出到csv,执行语言转换和其他操作,只需要几分之一秒。 – onmyway