Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Чем можно заменить/как ускорить forEach внутри forEach? (https://javascript.ru/forum/misc/83888-chem-mozhno-zamenit-kak-uskorit-foreach-vnutri-foreach.html)

Fortun 13.04.2022 18:23

Чем можно заменить/как ускорить forEach внутри forEach?
 
Приветствую.
Подскажите, можно ли как-то ускорить этот код?
Массив array может быть довольно-таки большим и постоянно увеличивается, вызов forEach на каждый его элемент рано или поздно приведет к большим задержкам.

const array = ['Заголовок1', 'Заголовок2'];

const arr = [...document.querySelectorAll(".visit-link"), ...document.querySelectorAll(".target-link > a")];

         array.forEach((myList) => {
            arr.forEach((el) => {
               if(myList == el.innerText) {
                   el.closest('.top-item-row').remove();
                }
            })

        });

рони 13.04.2022 18:57

Fortun,
по скорости надо смотреть
const array = ['Заголовок1', 'Заголовок2'];
            const link = document.querySelectorAll(".visit-link, .target-link > a");
            link.forEach(el => {
                if (array.includes(el.innerText)) {
                    el.closest('.top-item-row').remove();
                }
            })

ksa 13.04.2022 21:37

Цитата:

Сообщение от Fortun
можно ли как-то ускорить этот код?

рони уже показал один вариант...
Но если заменить forEach() на обычный цикл - это так же даст прирост по скорости.

Цитата:

Сообщение от Fortun
const array = ['Заголовок1', 'Заголовок2']

Можно заменить на
const o = {'Заголовок1': 1, 'Заголовок2': 1}


Тогда даже
Цитата:

Сообщение от рони
if (array.includes(el.innerText)) {}

Можно заменить на
if (o.[el.innerText]) {}

На больших количествах это так же может дать ускорение...

Nexus 14.04.2022 09:46

Если у вас увеличивается только первый массив, а второй (с элементами) остается неизменным, то есть смысл попробовать составить карту innerText => [...(.top-item-row)] и работать с ней.

const elements = [...document.querySelectorAll('.visit-link, .target-link > a')];

const elementsMap = {};
let item;
while (item = elements.shift()) {
    elementsMap[item.innerText] ??= [];
    elementsMap[item.innerText].push(
        item.closest('.top-item-row')
    );
}

function removeRows(titles) {
    for (let i = 0; i < titles.length; i++) {
        const list = elementsMap[titles[i]];
        if (!list) {
            continue;
        }
        
        for (let j = 0; j < list.length; j++) {
            list[j].remove();
        }
        
        delete elementsMap[titles[i]];
    }
}

removeRows(['Заголовок1', 'Заголовок2']);

Fortun 15.04.2022 18:03

Всем спасибо, буду пробовать!

P.S. Забавно. В свое время (2013 год) я этот аккаунт зарегистрировал, потому что мне был интересен js и я для себя делал всякие скрипты на сайтах через tampermonkey.
Прошло 9 лет.
Я таки перешел в программисты, уже два года опыта, разобрался во vue, участвовал в крупных проектах, и вот решил модифицировать один из своих старых скриптов. Улучшений оказалось очень много, но оказалось что вот с циклами я до сих пор не особо дружу, хех, ну вот не сталкивался я с ними в реальной работе, увы :)
(но видели бы вы как это место выглядело до рефакторинга, ууу.... Даже жаль что я не сохранил старый код)
Как же время летит....


Часовой пояс GMT +3, время: 20:27.