Как провести поиск по подстроке в массиве 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 шт):

Автор решения: RusArt

По сути перед вами стоит задача группировки значений. Сначала определимся с форматом результата. Для каждого домена нам нужен список почт. Это можно выразить объектом, где ключ - строка, а значение - массив. Далее рассматриваем каждую почту. Если ее домен уже есть в нашей группировке - добавляем ее туда, если нет - создаем новую пару в конечном результате. Удобно это сделать через функцию 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]"
    ]
}

Выделить домен тут удобно разделением строки по символу @

→ Ссылка