Есть массив с вложенным масивом, который проверяет, есть ли у двух массивов общее значение определённого ключа. Но почему-то при работе такого скрипта зависает вкладка, съедая полтора гигабайта оперативной памяти. Хотя в скрипте нет ничего сверхсложного:
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 нужно проверять, а нет ли там уже такого массива. Если моё суждение не верно и это можно сделать проще - рад буду каждому совету. Спасибо всем за помощь!
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости