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.Name
string 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);
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 getInitials
hieronder:
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'));
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'));
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')
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