Есть массив с вложенным масивом, который проверяет, есть ли у двух массивов общее значение определённого ключа. Но почему-то при работе такого скрипта зависает вкладка, съедая полтора гигабайта оперативной памяти. Хотя в скрипте нет ничего сверхсложного:
for(let i = 0; i < temp_props.length; i++) {
for(let j = 0; j < proposals.length; j++) {
if(temp_props[i].sign == proposals[j].sign) {
proposals[j].terms.push(temp_props[i].terms[0])
} else {
proposals.push(temp_props[i]);
}
}
}
Почему вообще происходит утечка?
UPD: а почему вот тут всё зависает? Я же в proposals
не пушу новые элементы, а только изменяю существующие(proposals.length
не меняется же):
if(proposals.length == 0) {
for(let i = 0; i < iteration_proposals.length; i++) {
proposals.push(iteration_proposals[i]);
}
} else {
let others_props = [];
let other_terms = [];
for(let j = 0; j < iteration_proposals.length; j++) {
for(let i = 0; i < proposals.length; i++) {
if(iteration_proposals[j].sign == proposals[i].sign)
(proposals[i].terms).push(iteration_proposals[j].terms[0]);
else
others_props.push(iteration_proposals[j]);
}
}
for(let i = 0; i < others_props.length; i++) {
proposals.push(others_props[i]);
}
}
Касаемо первого вопроса(до UPD): как верно подметили @Grundy и @andreymal, нельзя изменять массив, итерируемый циклом. Решил эту проблему тем, что перед циклом создавал let temporary = []
массив, пушил в него результат, а по окончанию основного цикла брал всё, что насобиралось в temporary
, и вставлял в глобальный массив.
Касаемо второго вопроса(в UPD): проблема была в том, что во вложенном цикле проверялись все элементы. И если какой-то один элемент удовлетворил условию и успешно запушился в глобальный массив, то все остальные пушились в temporary
proposals.length раз. Как вариант решения такой проблемы я рассматриваю проверку на дубли во временном массиве. Если условие и зашло в else, то перед пушем массива в temporary
нужно проверять, а нет ли там уже такого массива. Если моё суждение не верно и это можно сделать проще - рад буду каждому совету. Спасибо всем за помощь!
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как отправить данные через Ajax методом GET? Можно ли вообще отправлять данные на сервер через Ajax методом GET?