使用JS获取名称首字母

Mat*_*ics 24 javascript jquery

我的要求是将名字缩写为,

Name = FirstName LastName 

Initials =  FL
Run Code Online (Sandbox Code Playgroud)

我可以用这个得到上面的结果,

var initials = item.FirstName.charAt(0).toUpperCase() + 
                                   item.LastName.charAt(0).toUpperCase();
Run Code Online (Sandbox Code Playgroud)

但现在我的要求被更改,好像名称只包含1个字或更多2个字,所以在下面的情况下,我如何根据我的要求获得缩写,

FullName =  FU

FirstName MiddleName LastName = FL

1stName 2ndName 3rdName 4thName 5thName = 15
Run Code Online (Sandbox Code Playgroud)

如何从JS中的字符串中获取上述内容?

现在我只有item.Name字符串进来....

Sha*_*oor 37

为什么不喜欢正则表达式?

var name = 'Foo Bar 1Name too Long';
var initials = name.match(/\b\w/g) || [];
initials = ((initials.shift() || '') + (initials.pop() || '')).toUpperCase();
console.log(initials);
Run Code Online (Sandbox Code Playgroud)

  • @thetallweeks 你说得对,我编辑了代码来处理单字名称和空字符串。 (5认同)
  • 这适用于仅使用基本 26 个字母的名称。不支持带有变音符号的名称。 (4认同)
  • “为什么不喜欢正则表达式?” 因为正则表达式通常可读性较差,并且在极端情况下更容易出错。只需查看对此答案的评论即可证明。 (3认同)
  • 请注意,这不能很好地处理一个单词的名称。“ Prince”具有首字母“ PUNDEFINED” (2认同)

Van*_*esh 25

常见头像用例

\n

令我惊讶的是,所有答案都没有得到Array.reduce()很好的利用。

\n
const getInitials = (fullName) => {\n  const allNames = fullName.trim().split(\' \');\n  const initials = allNames.reduce((acc, curr, index) => {\n    if(index === 0 || index === allNames.length - 1){\n      acc = `${acc}${curr.charAt(0).toUpperCase()}`;\n    }\n    return acc;\n  }, \'\');\n  return initials;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

运行下面的代码片段来检查不同用例的缩写 -

\n

\r\n
\r\n
const getInitials = (fullName) => {\n  const allNames = fullName.trim().split(\' \');\n  const initials = allNames.reduce((acc, curr, index) => {\n    if(index === 0 || index === allNames.length - 1){\n      acc = `${acc}${curr.charAt(0).toUpperCase()}`;\n    }\n    return acc;\n  }, \'\');\n  return initials;\n}\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

\n注意\n

\n此方案适用于在头像中显示姓名的广泛使用的情况,您不希望名字首字母重复两次,并且希望将首字母限制为最多 2 个字母\n

  • 这对我来说是赢家。不需要我安装任何 unicode REGEX 东西就可以在 ES5 浏览器上运行! (3认同)

njm*_*was 24

你可以使用这个速记js

"FirstName LastName".split(" ").map((n)=>n[0]).join(".");
Run Code Online (Sandbox Code Playgroud)

要仅获取名字和姓氏,您可以使用此简写功能

(fullname=>fullname.map((n, i)=>(i==0||i==fullname.length-1)&&n[0]).filter(n=>n).join(""))
("FirstName MiddleName OtherName LastName".split(" "));
Run Code Online (Sandbox Code Playgroud)

  • 这并没有完全回答原来的问题 - 如果你有一个MiddleName,这将返回'FML'. (3认同)

And*_*rea 22

检查以下getInitials功能:

var getInitials = function (string) {
    var names = string.split(' '),
        initials = names[0].substring(0, 1).toUpperCase();
    
    if (names.length > 1) {
        initials += names[names.length - 1].substring(0, 1).toUpperCase();
    }
    return initials;
};

console.log(getInitials('FirstName LastName'));
console.log(getInitials('FirstName MiddleName LastName'));
console.log(getInitials('1stName 2ndName 3rdName 4thName 5thName'));
Run Code Online (Sandbox Code Playgroud)

函数用空格分隔输入字符串:

names = string.split(' '),
Run Code Online (Sandbox Code Playgroud)

然后得到第一个名字,并得到第一个字母:

initials = names[0].substring(0, 1).toUpperCase();
Run Code Online (Sandbox Code Playgroud)

如果有多个名称,则需要姓氏的第一个字母(位置中的一个names.length - 1):

if (names.length > 1) {
    initials += names[names.length - 1].substring(0, 1).toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)


chi*_*ens 11

最短的一个班轮:

获取第一个和最后一个首字母: John Doe Smith => JS

name.match(/(\b\S)?/g).join("").match(/(^\S|\S$)?/g).join("").toUpperCase()
Run Code Online (Sandbox Code Playgroud)

获取所有首字母: "John Doe Smith" => "JDS"

name.match(/(\b\S)?/g).join("").toUpperCase()
Run Code Online (Sandbox Code Playgroud)

如果只有第一个,则获取第一个和最后一个,除了获取第一个 2。(OP的问题)

John => JO"John Doe Smith" => "JS"

name.match(/(^\S\S?|\b\S)?/g).join("").match(/(^\S|\S$)?/g).join("").toUpperCase()
Run Code Online (Sandbox Code Playgroud)

注意:如果名称包含,或其他非单词字符,您可以使用/w代替/S或事先清理它


siw*_*ikm 8

还有一些其他答案可以解决您的查询,但稍微复杂一些。这是一个更具可读性的解决方案,它涵盖了大多数边缘情况。

由于您的全名可以包含任意数量的单词(中间名),因此我们最好的办法是将其放入一个数组中,并从该数组中的第一个和最后一个单词中获取初始字符,然后将字母一起返回。

此外,如果您的 'fullName' 仅包含一个单词,则单词 atarray[0]array[array.length - 1]将是同一个单词,因此我们正在处理如果第一个if.

function nameToInitials(fullName) {
  const namesArray = fullName.trim().split(' ');
  if (namesArray.length === 1) return `${namesArray[0].charAt(0)}`;
  else return `${namesArray[0].charAt(0)}${namesArray[namesArray.length - 1].charAt(0)}`;
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

> nameToInitials('Prince') // "P"

> nameToInitials('FirstName LastName') // "FL"

> nameToInitials('1stName 2ndName 3rdName 4thName 5thName') // "15"


小智 7

您使用以下一行逻辑:

"FirstName MiddleName LastName".split(" ").map((n,i,a)=> i === 0 || i+1 === a.length ? n[0] : null).join("");
Run Code Online (Sandbox Code Playgroud)


小智 7

'Aniket Kumar Agrawal'.split(' ').map(x => x.charAt(0)).join('').substr(0, 2).toUpperCase()
Run Code Online (Sandbox Code Playgroud)

  • 也许可以解释一下这是做什么的? (4认同)

NMI*_*NMI 6

let initial = username.match(/\b(\w)/g).join('')
Run Code Online (Sandbox Code Playgroud)


gur*_*dev 5

你可以为此做一个函数:

var name = 'Name';

function getInitials( name,delimeter ) {

    if( name ) {

        var array = name.split( delimeter );

        switch ( array.length ) {

            case 1:
                return array[0].charAt(0).toUpperCase();
                break;
            default:
                return array[0].charAt(0).toUpperCase() + array[ array.length -1 ].charAt(0).toUpperCase();
        }

    }

    return false;

}
Run Code Online (Sandbox Code Playgroud)

小提琴: http: //jsfiddle.net/5v3n2f95/1/