Naam initialen ophalen met JS

Ik wil initialen uit een string halen, zoals:

Name = FirstName LastName 
Initials =  FL

Ik kan hiermee het bovenstaande resultaat krijgen,

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

Maar nu zijn mijn vereisten gewijzigd alsof de naam slechts uit 1 woord bestaat of meer dan 2, dus in de volgende gevallen hoe kan ik initialen krijgen volgens mijn vereisten,

FullName =  FU
FirstName MiddleName LastName = FL
1stName 2ndName 3rdName 4thName 5thName = 15

Hoe krijg ik bovenstaande initialen van een string in JS?

Ook nu heb ik alleen item.Namestring als invoer


Antwoord 1, autoriteit 100%

Waarom geen liefde voor regex?

Bijgewerkt om unicode-tekens te ondersteunen en ES6-functies te gebruiken

let name = 'ÇFoo Bar 1Name too ÉLong';
let rgx = new RegExp(/(\p{L}{1})\p{L}+/, 'gu');
let initials = [...name.matchAll(rgx)] || [];
initials = (
  (initials.shift()?.[1] || '') + (initials.pop()?.[1] || '')
).toUpperCase();
console.log(initials);

Snippet uitvouwen


Antwoord 2, autoriteit 65%

U kunt deze steno js gebruiken

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

Om alleen de voornaam en achternaam te krijgen, kunt u deze verkorte functie gebruiken

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

Antwoord 3, autoriteit 57%

Controleer de functie getInitialshieronder:

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'));

Snippet uitvouwen


Antwoord 4, autoriteit 8%

let initial = username.match(/\b(\w)/g).join('')

Antwoord 5, autoriteit 5%

Je kunt daar een functie voor doen:

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/


Antwoord 6, autoriteit 3%

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'));

Antwoord 7

Gemakkelijker met kaartfunctie:

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

Antwoord 8

Deze oplossing maakt gebruik van array-mogelijkheden, pijlfunctie en ternaire operator om het doel in één regel te bereiken.
Als de naam een ​​enkel woord is, neem dan gewoon de eerste twee tekens, maar als er meer zijn, neem dan de eerste tekens van de voor- en achternaam.
(bedankt omn voor het herinneren van de naam van een enkel woord)

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()

Antwoord 9

Eenvoudige manier met ES6 Destructering:

const getInitials = string =>
  string
    .split(' ')
    .map(([firstLetter]) => firstLetter)
    .filter((_, index, array) => index === 0 || index === array.length - 1)
    .join('')
    .toUpperCase();

Antwoord 10

Vergelijkbare maar iets netter versie van @njmwas antwoord:

let name = 'Fred Smith';
let initials = name.split(' ').reduce((acc, subname) =>
    acc + subname[0], '')
console.log(initials) // FS

Of, om de afkortingspunten op te nemen:

let name = 'Fred Smith';
let initials = name.split(' ').reduce((acc, subname) =>
    acc + subname[0] + '.', '')
console.log(initials) // F.S.

Antwoord 11

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

12

function getInitials(name) {
  return (
    name
      .match(/(?<=\s|^)\p{L}\p{Mn}*/gu)
      ?.filter((el, i, array) => i === 0 || i === array.length - 1)
      .join("") || ""
  );
}
console.log(getInitials('ÇFoo Bar 1Name too ÉLong'));
console.log(getInitials('Q̈lice Hwerty')); // Q is followed by U+0308 (Combining Diaeresis)
console.log(getInitials('A Foo'));
console.log(getInitials('Bob'));

Snippet uitvouwen


Antwoord 13

+ efficiënt
+ geen lussen
+ vereenvoudigde vertakking (alleen ternaire operator)
+ behandelt gevallen zonder ruimte (drukt 2 tekens af)
+ geen array-geheugentoewijzing (eigenlijk geen array-verwerking)
– vereist bijgesneden stringinvoer

function getInitials(name) {
    const hasTokens = name.indexOf(' ') !== -1
    return name.substring(0, hasTokens ? 1 : 2) + (hasTokens ? name.charAt(name.lastIndexOf(' ') + 1) : '')
}
console.log(getInitials("A B"), 'AB')
console.log(getInitials("Abc Def"), 'AD')
console.log(getInitials("Abc Xyz"), 'AX')
console.log(getInitials("S Xyz"), 'SX')
console.log(getInitials("SXyz "), 'SX')
console.log(getInitials("T30"), 'T3')

Snippet uitvouwen


Antwoord 14

zojuist Andrea’s versie bijgewerkt:

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;
};

als stringLastName bevat, verander dan gewoon names.lengthin names.length-1om achternaam te negeren

Other episodes