【问题标题】:Angular filter to initialise first name角度过滤器初始化名字
【发布时间】:2016-09-22 16:23:57
【问题描述】:

我需要制作一个角度过滤器,它将采用全名,并初始化名字,只留下姓氏,除非在某些情况下(例如 Van Aanholt)。

所以如下:

Yohan Cabaye 
Oscar 
Jordi Alba Ramos 
Patrick Van Aanholt
Hatem Ben Arfa

将显示为:

Y. Cabaye
Oscar
J. Ramos
P. Van Aanholt
H. Ben Arfa

任何帮助将不胜感激。


更新:这是我尝试过的......

    angular.module('euroFilters', [])

              .filter('initialiseName', function() {

                        return function(name) {

var nameArr = name.split(' ');

var firstName = nameArr[0];
var firstNameInitial = nameArr[0][0] + ". ";

var lastName = nameArr[nameArr.length - 1];

var secondaryLastName = nameArr[nameArr.length - 2];

// If only one name (standard)...

if (nameArr.length <= 1) {
  return firstName;
}

// If more than one name, and contains "Van" or "Ben" (exception)...
else if (secondaryLastName === "Van" || secondaryLastName === "Ben") {
  return firstNameInitial + " " + secondaryLastName + " " + lastName;
}

// If more than one name (standard)...
else if (nameArr.length > 1) {
  return firstNameInitial + lastName;
}

};

});

有没有更优雅的方式来写这个?例如,它将如何转换为switch 语句?

【问题讨论】:

  • 已添加更新 - 请查看。

标签: angularjs filter initialization names


【解决方案1】:

您可以为此使用拆分和连接。字符串是像对象一样的数组,所以你可以在它们上使用索引。

angular.module('app', []);

angular.module('app').filter('initialiseFirstName', function () {
  return function (name) {
    var parts = name.split(/\s+/);
    
    if (parts.length <= 1) {
      return name;
    }
    
    var first = parts[0][0] + '.';
    
    return first + ' ' + parts.slice(1).join(' ');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  {{'John Ket'|initialiseFirstName}}
</div>

【讨论】:

  • 这有帮助,但还没有完全明白 - 你能看到我的更新吗?
【解决方案2】:

这应该可以满足您的需要:

<div ng-app="app">
  {{'John Von Koten'|initialiseFirstName}}
</div>

<script>
angular.module('app', []);

angular.module('app').filter('initialiseFirstName', function () {
function checkName(name){
        var prefixes = ['Van', 'Ben', 'Von'];
      for(var i = 0; i < prefixes.length; i++){
      if(name.indexOf(prefixes[i]) > 0){
      return true;
      }
      }
      return false;
  }

  return function (name) {
    var parts = name.split(/\s+/);

    if (parts.length <= 1) {
      return name;
    }

   if(parts.length > 2){ 
   if(checkName(name)){
     return parts[0][0] + '. ' + parts[1] + ' '+ parts[2];
    }
    }

    var first = parts[0][0] + '.';

    return first + ' ' + parts.slice(1).join(' ');
  }


});
</script>

【讨论】:

  • 谢谢。 .split() 方法中/\s+/ 部分的用途是什么?
  • 这是一个正则表达式,说明只要字符串中有 1 个或多个空格,您就想拆分。 (\s 代表空格,+ 表示一个或多个)
  • 好的,谢谢。我在 JSFiddle 中尝试过,前缀部分似乎出错了 - 它返回“未定义”,我不知道为什么 - 可能与 if(name.indexOf(prefixes[i]) &gt; 0) 行有关?小提琴:jsfiddle.net/Paulos3000/rhba9w57
  • 是的,我注意到了,我忘记了 for 循环中的 var。将for(i = 0; i &lt; prefixes.length; i++) 更改为for(var i = 0; i &lt; prefixes.length; i++)
  • 有人标记了这个,不知道为什么。它可能不是最优雅的解决方案,但它可以解决这个问题。请证明。
猜你喜欢
  • 2016-06-14
  • 2011-12-17
  • 1970-01-01
  • 2016-03-07
  • 2018-08-31
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多