Вложенный цикл вызывает утечку памяти

287
02 октября 2017, 03:14

Есть массив с вложенным масивом, который проверяет, есть ли у двух массивов общее значение определённого ключа. Но почему-то при работе такого скрипта зависает вкладка, съедая полтора гигабайта оперативной памяти. Хотя в скрипте нет ничего сверхсложного:

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]);
    }
}
Answer 1

Касаемо первого вопроса(до UPD): как верно подметили @Grundy и @andreymal, нельзя изменять массив, итерируемый циклом. Решил эту проблему тем, что перед циклом создавал let temporary = [] массив, пушил в него результат, а по окончанию основного цикла брал всё, что насобиралось в temporary, и вставлял в глобальный массив.

Касаемо второго вопроса(в UPD): проблема была в том, что во вложенном цикле проверялись все элементы. И если какой-то один элемент удовлетворил условию и успешно запушился в глобальный массив, то все остальные пушились в temporary proposals.length раз. Как вариант решения такой проблемы я рассматриваю проверку на дубли во временном массиве. Если условие и зашло в else, то перед пушем массива в temporary нужно проверять, а нет ли там уже такого массива. Если моё суждение не верно и это можно сделать проще - рад буду каждому совету. Спасибо всем за помощь!

READ ALSO
Ajax запрос при отправке?

Ajax запрос при отправке?

Как отправить данные через Ajax методом GET? Можно ли вообще отправлять данные на сервер через Ajax методом GET?

263
new Option(text, value, defaultSelected, selected);

new Option(text, value, defaultSelected, selected);

Если создавать опцию как:

383
Некорректный вывод текста из файла

Некорректный вывод текста из файла

Есть код который выводит в блок текст из файла:

350