Вот краткий способ сделать это с filter
, map
, shift
и регулярным выражением в одной цепочке операций.Техника будет работать с любым количеством пробелов, см. Пример ниже и вернет undefined
, если идентификатор контакта не найден.
Сначала вы фильтруете массив для правильного идентификатора, это возвращает массив (может быть пустым), на котором вы отображаете, чтобы извлечь инициалы с String.match
, регулярным выражением и Array.join
.Затем вы сдвигаете первый элемент, чтобы получить результат, shift
не вызовет ошибку, если элемента нет, и просто вернет undefined
.
Вот два возможных регулярных выражения для извлечения инициалов:
/\b(\w)/g
/(?<=(\s+|^))(\w)/g
Первое регулярное выражение использует \b
для сопоставления границ слова, тогда как \w
будет соответствовать любому символу слова, поэтому регулярное выражение \b(\w)
будет захватывать первый символ каждого слова.Это регулярное выражение не будет выполнено, когда имена разделены тире, так как тире будет считаться разделителем слов.
Второе регулярное выражение будет соответствовать каждому первому слову, используя положительный знак поиска за (?<=(\s+|^))
, который проверяет пробелы илиначало строки.
const contactList = [{
"id": 'e3d46de8c7194cb1a32275195c15dc07',
"name": ' Niels Bohr',
"num_messages": 62,
}, {
'id': '7064c3f9c99743b2838bbd8eacafe0d6',
"name": 'Max Planck ',
"num_messages": 15,
}, {
"id": 'b19e575a0d3f4151a1391452d8a47a44',
"name": ' Jane Goodall',
"num_messages": 20,
}, {
"id": '17d9d0908f454253b5337e8c1ef4b564',
"name": "Caroline Herschel",
"num_messages": 3,
}];
function getInitials(id) {
return contactList
.filter(contact => contact.id === id)
.map(contact => contact.name.match(/(?<=(\s+|^))(\w)/g).join(''))
.shift();
}
console.log(getInitials('17d9d0908f454253b5337e8c1ef4b564'));
console.log(getInitials('b19e575a0d3f4151a1391452d8a47a44'));
console.log(getInitials('7064c3f9c99743b2838bbd8eacafe0d6'));
console.log(getInitials('e3d46de8c7194cb1a32275195c15dc07'));
console.log(getInitials('123'));