Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.04.2022, 18:23
Интересующийся
Отправить личное сообщение для Fortun Посмотреть профиль Найти все сообщения от Fortun
 
Регистрация: 13.06.2013
Сообщений: 15

Чем можно заменить/как ускорить 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();
                }
            })

        });
Ответить с цитированием
  #2 (permalink)  
Старый 13.04.2022, 18:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

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();
                }
            })
Ответить с цитированием
  #3 (permalink)  
Старый 13.04.2022, 21:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

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

Сообщение от Fortun
const array = ['Заголовок1', 'Заголовок2']
Можно заменить на
const o = {'Заголовок1': 1, 'Заголовок2': 1}


Тогда даже
Сообщение от рони
if (array.includes(el.innerText)) {}
Можно заменить на
if (o.[el.innerText]) {}

На больших количествах это так же может дать ускорение...
Ответить с цитированием
  #4 (permalink)  
Старый 14.04.2022, 09:46
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Если у вас увеличивается только первый массив, а второй (с элементами) остается неизменным, то есть смысл попробовать составить карту 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']);
Ответить с цитированием
  #5 (permalink)  
Старый 15.04.2022, 18:03
Интересующийся
Отправить личное сообщение для Fortun Посмотреть профиль Найти все сообщения от Fortun
 
Регистрация: 13.06.2013
Сообщений: 15

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем можно организовать запуск скрипта атом. по времени. I5Rek Серверные языки и технологии 2 01.05.2011 23:00
Можно ли как-то сократить скрипт случайной цитаты (см. внутри)? Hyuga_Nia Общие вопросы Javascript 4 20.01.2011 22:00
Как можно сократить (и можно ли) этот скрипт (см. внутри)? Hyuga_Nia Общие вопросы Javascript 28 20.01.2011 21:48
Чем можно заменить свойство contentEditable=true ? iMichaeli7 Javascript под браузер 5 20.10.2010 11:27
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00