Получение инициалов имени с использованием JS

Мое требование состояло в том, чтобы получить инициалы имен как,

Name = FirstName LastName 

Initials =  FL

Я могу получить результат, используя это,

var initials = item.FirstName.charAt(0).toUpperCase() + 
                                   item.LastName.charAt(0).toUpperCase();

Но теперь мои требования меняются так, как будто имя состоит только из 1 или более слов, а затем в следующих случаях, как я могу получить инициалы в соответствии с моими требованиями,

FullName =  FU

FirstName MiddleName LastName = FL

1stName 2ndName 3rdName 4thName 5thName = 15

Как я могу получить от intials из строк в JS?

Кроме того, теперь у меня есть только строка item.Name.

Ответ 1

Почему нет любви к регулярному выражению?

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

Ответ 2

Вы можете использовать эту стенографию JS

"FirstName LastName".split(" ").map((n)=>n[0]).join(".");

Чтобы получить только имя и фамилию, вы можете использовать эту сокращенную функцию

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

Ответ 3

Проверьте функцию 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'));

Ответ 4

Вы используете ниже одну строку логики:

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

Ответ 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;

}

Fiddle: http://jsfiddle.net/5v3n2f95/1/

Ответ 6

Легче с функцией отображения:

var name = "First Last";
var initials = Array.prototype.map.call(name.split(" "), function(x){ return x.substring(0,1).toUpperCase();}).join('');

Ответ 7

'Aniket Kumar Agrawal'.split(' ').map(x => x.charAt(0)).join('').substr(0, 2).toUpperCase()

Ответ 8

Это решение использует возможности массива, функцию стрелки и троичного оператора для достижения цели в одной строке. Если имя - одно слово, просто возьмите первые два знака, но если больше, то возьмите первые символы имени и фамилии. (спасибо, omn за напоминание об одном случае использования имени слова)

string.trim().split(' ').reduce((acc, cur, idx, arr) => acc + (arr.length > 1 ? (idx == 0 || idx == arr.length - 1 ? cur.substring(0, 1) : '') : cur.substring(0, 2)), '').toUpperCase()

Ответ 9

только что обновленная версия Андреа:

var getInitials = function (string) {
   var initials = "";
   var names = string.split(' ');
   for (n = 0; n < names.length; n++) {
        initials += names[n].substring(0, 1).toUpperCase();
    }
    return initials;
};

если строка содержит LastName, просто измените names.length на names.length-1, чтобы игнорировать фамилию

Ответ 10

  const getInitials = name => {
    let initials = '';
    name.split(' ').map( subName => initials = initials + subName[0]);
    return initials;
  };

Ответ 11

Вы можете сделать что-то вроде этого;

    function initials(name){

      //splits words to array
      var nameArray = name.split(" ");

      var initials = '';

      //if it a single word, return 1st and 2nd character
      if(nameArray.length === 1) {
        return nameArray[0].charAt(0) + "" +nameArray[0].charAt(1);
      }else{
         initials = nameArray[0].charAt(0);
      }
      //else it more than one, concat the initials in a loop
      //we've gotten the first word, get the initial of the last word


      //first word
      for (i = (nameArray.length - 1); i < nameArray.length; i++){
        initials += nameArray[i].charAt(0);
      }
     //return capitalized initials
     return initials.toUpperCase();
   }

Затем вы можете использовать функцию, как это;

  var fullname = 'badmos tobi';
  initials(fullname); //returns BT 

  var surname = 'badmos';
  initials(surname); //returns BA

  var more = 'badmos gbenga mike wale';
  initials(more); //returns BW;

Надеюсь, это поможет.

Ответ 12

const getInitials = name => name
  .replace(/[^A-Za-z0-9À-ÿ ]/ig, '')        // taking care of accented characters as well
  .replace(/ +/ig, ' ')                     // replace multiple spaces to one
  .split(/ /)                               // break the name into parts
  .reduce((acc, item) => acc + item[0], '') // assemble an abbreviation from the parts
  .concat(name.substr(1))                   // what if the name consist only one part
  .concat(name)                             // what if the name is only one character
  .substr(0, 2)                             // get the first two characters an initials
  .toUpperCase();                           // uppercase, but you can format it with CSS as well

console.log(getInitials('A'));
console.log(getInitials('Abcd'));
console.log(getInitials('Abcd Efgh'));
console.log(getInitials('Abcd    Efgh    Ijkl'));
console.log(getInitials('Abcd Efgh Ijkl Mnop'));
console.log(getInitials('Ábcd Éfgh Ijkl Mnop'));
console.log(getInitials('Ábcd - Éfgh Ijkl Mnop'));
console.log(getInitials('Ábcd / # . - , Éfgh Ijkl Mnop'));

Ответ 13

Используя некоторые функции es6:

const testNameString = 'Hello World';
const testNameStringWeird = 'Hello  darkness My  - Óld Friend Nikolaus Koster-Walder ';
const getInitials = nameString =>{
       const regexChar = /\D\w+/
       return nameString
        .trim() //remove trailing spaces
        .split(' ') // splits on spaces
        .filter(word => word.length > 0) // strip out double spaces
        .filter(word => regexChar.test(word)) // strip out special characters
        .map(word => word.substring(0, 1).toUpperCase()) // take first letter from each word and put into array
}
console.log('name:',testNameString,'\n initials:',getInitials(testNameString));
console.log('name:',testNameStringWeird,'\n initials:',getInitials(testNameStringWeird));

Ответ 14

  Есть и другие ответы, которые решают ваш запрос, но немного сложнее. Здесь более читаемое решение, которое охватывает большинство крайних случаев.

Поскольку ваше полное имя может содержать любое количество слов (отчеств), лучше всего разбить его на массив и получить начальные символы из первых и последних слов в этом массиве и вернуть буквы вместе.

Также, если ваше полное имя содержит только одно слово, слова в array[0] и array[array.length - 1] будут одним и тем же словом, поэтому мы обрабатываем это, если первое if.

function nameToInitials(fullName) {
  const namesArray = fullName.split(' ');
  if (namesArray.length === 1) return '${namesArray[0].charAt(0)}';
  else return '${namesArray[0].charAt(0)}${namesArray[namesArray.length - 1].charAt(0)}';
}

Примеры выходных данных:

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

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

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

Ответ 15

var personName = "FirstName MiddleName LastName";
var userArray = personName.split(" ");
var initials = [];
if(userArray.length == 1){
 initials.push(userArray[0][0].toUpperCase() + userArray[0][1]).toUpperCase();}
else if(userArray.length > 1){
initials.push(userArray[0][0].toUpperCase() + userArray[userArray.length-1][0].toUpperCase());}
console.log(initials);

Ответ 16

Это должно работать в большинстве случаев, включая отчество и только имя (расширение @njmwas answer).

const initialArr = name.split(" ").map((n)=>n[0]);
const init = (initialArr.length > 1)? '${initialArr[0]}${initialArr[initialArr.length - 1]}' : initialArr[0];
const initials = init.toUpperCase();