将带有可选全名的字符串转换为name和initial

时间:2016-07-08 11:11:37

标签: javascript regex

我需要将带有名称的字符串转换为名称和首字母以逗号分隔的字符串。

示例

Any-Name Tom, Name Brian Joe, Smith Judie, et al.
Any-Name T., Name Brian J., Smith J., et al.
Any-Name T, Name B J, Smith J, et al.
Any-Name Tom,Name Brian Joe,Smith Judie, et al.

......应该全部获得

Any-Name T, Name BJ, Smith J, et al.

et al.是可选的。所以......

Any-Name Tom, Name Brian Joe, Smith Judie

......应该

Any-Name T, Name BJ, Smith J

我试着这样做:

var names = string.split(",");
names.forEach(function(name) {
    name = name.trim();
    var parts = name.split(" ");
    parts.forEach(function(part, index) { 
        if (index > 0) {
            var initial = part.slice(0,1);
            // get upper case
        }
    });
});

但这似乎有点复杂......

2 个答案:

答案 0 :(得分:2)

你几乎已经过去了。

此提案使用Array#reduce连接名称的各个部分,并应用所需的大写首字母。

如果需要,'et al'可以使用大写字符串。如果找到了,则稍后将其添加到结果中。



function reName(string) {
    var names = string.split(","),
        etal = names[names.length - 1].indexOf('et al') !== -1 ? names.pop().trim() : '',
        condensed = names.map(function (name) {
            return name.trim().split(" ").reduce(function (r, part, index) {
                return index ? r + part[0].toUpperCase() : part + ' ';
            }, '');
        });

    etal && condensed.push(etal);
    return condensed.join(', ');
}

console.log(reName('Any-Name Tom, Name Brian Joe, Smith Judie'));
console.log(reName('Any-Name Tom, Name Brian Joe, Smith Judie, et al.'));




答案 1 :(得分:1)

此解决方案不会简化OP,但它通过创建一个名为newNames的新字符串并将组件部分(名字和缩写&等)写入其中来完成它。

var str="Any-Name Tom, Name Brian Joe, Smith Judie";
var names = str.split(",");
var newNames = "";
names.forEach(function(name) {
  var neatName;
  name = name.trim();
  var parts = name.split(" ");
  parts.forEach(function(part, index) {
    if (index === 0) neatName = part + " ";
    if (index > 0) {
      var initial = part.slice(0, 1);
      neatName += initial;
    }
  });
  newNames+=neatName + ", ";
});
newNames+="et al.";
document.write(newNames)