将具有多个全名的字符串转换为具有第一个字符姓氏

时间:2018-01-05 00:24:48

标签: javascript

我需要将一个包含多个名称的字符串和一个字符串末尾的可选'et al'转换为一个字符串,其中包含姓名和每个姓氏的第一个字符。

为了更容易理解:

Name Firstname, name firstname secondname et al
Name Firstname, name firstname secondname, et al
Name Firstname,name firstname secondname,et al
Name Firstname, name firstname secondname, et al.
Name Firstname,     name     firstname     secondname,   et   al.
Name F., name firstn. sec., et al.
Name F, name f s, et al.

......都应该导致:

Name F, Name FS et al.

所以这就是我目前使用的内容,但是第一个示例因为丢失了最后一个逗号而失败。

我的第一步必须是提取可选的'et al'字符串。在此之后,分裂是有道理的......

也许有人有想法让代码更容易一些:

const names = string.split(',')
const etal = names[names.length - 1].indexOf('et al') !== -1 && names.pop().trim()

const condensed = names.map(function (name) {
  return name.trim().split(' ').reduce(function (r, part, index) {
    return index ? r + part[0].toUpperCase() : part + ' '
  }, '')
})

etal && condensed.push('et al.')
return condensed.join(', ').trim()

2 个答案:

答案 0 :(得分:1)

可能有更好的解决方案,但我想出了以下内容:



var names = [
  "Name Firstname,name firstname secondname,et al",
  "Name Firstname, name firstname secondname, et al.",
  "Name Firstname,     name     firstname     secondname,   et   al.",
  "Name F., name firstn. sec., et al.",
  "Name F, name f s, et al."
];
var nameRes = names.map(function(name){
  nameTemp = name.split(',');
  let res = "";
  nameTemp.forEach(function(n, i){
    if(i==0){
      res = n.split(' ')[0] + " " + n.split(' ')[1].charAt(0);
    }
    if(i==1){
      n = n.split(' ').filter(j=>j!=="");
      var n1 = n[0].charAt(0).toUpperCase() + n[0].slice(1);
      var n2 = (n[1].charAt(0) + n[2].charAt(0)).toUpperCase();
      n = n1+' '+n2
      res += ', ' + n;
    }
    if(i==2){
      res += ' ' + n.split(' ').filter(j=>j!=="").join(' ');
    }
  });
  
  return res;
});
console.log(nameRes);




答案 1 :(得分:0)

我认为你使用的方法很冗长(难以阅读,因为你正在链接函数调用)我会使用正则表达式去除你想要的元素。正则表达式看起来像这样你可以先摆脱额外的空格和“FirstName”和“name”

string.replace(/[ ]{2,}/g , " ");
string.replace(/FirstName, | name /g, "");

离开你了 姓名firstname,secondname,et al

然后你会写另一个正则表达式,如

let set = /\B .+ .+\B(?=, et al\b)/g;

然后

string.replace( set, "");

有关正则表达式的更全面讨论,请访问此link

您还可以组合所有步骤,但这使得正则表达式难以阅读并破译正在发生的事情。正则表达式是为使用较少的代码行进行这些替换而构建的。如果你在步骤中执行它而不是链接函数调用,你有3或4个字符串替换调用,使代码更容易阅读。这并没有解释所有的不一致,但希望你能得到一般的想法。