Как провести поиск по подстроке в массиве JavaScript, состоящем из строк?
Собственно, изучая JS поставил себе задачу (как оказалось, не по силам): сортировку email'ов по доменам из одного массива в разные массивы, каждый из которых соответствует определенным доменам. Пробовал разные варианты от простых переборов массива, но если строку вытащить получается, то чаcть ее - никак. Смотрел разные варианты и сильно усложнил себе код - так, что сам перестаю понимать, что у меня происходит)) Текущая реализация кода выглядит так:
const arrEmails = [
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
'[email protected]',
];
const arrY = [];
const arrM = [];
const arrGM = [];
function sortEmails() {
for (i = 0; i < arrEmails; i++) {
let pos = arrEmails.find((el) => typeof el === "string");
if (pos.search('@mail.ru') === true || pos.search('@bk.ru') === true) {
arrM.push(arrEmails[i]);
} else {
arrGM.push(arrEmails[i]);
}
}
}
sortEmails()
console.log(arrY, arrM, arrGM)
Ответы (1 шт):
По сути перед вами стоит задача группировки значений. Сначала определимся с форматом результата. Для каждого домена нам нужен список почт. Это можно выразить объектом, где ключ - строка, а значение - массив. Далее рассматриваем каждую почту. Если ее домен уже есть в нашей группировке - добавляем ее туда, если нет - создаем новую пару в конечном результате. Удобно это сделать через функцию reduce
arrEmails.reduce((acc, email) => {
const domain = email.split('@').pop();
if (!acc[domain]) {
acc[domain] = []
}
acc[domain].push(email)
return acc
}, {})
{
"mail.ru": [
"[email protected]",
"[email protected]",
"[email protected]"
],
"bk.ru": [
"[email protected]"
],
"gmail.com": [
"[email protected]",
"[email protected]",
"[email protected]"
],
"yandex.ru": [
"[email protected]",
"[email protected]"
]
}
Выделить домен тут удобно разделением строки по символу @