изменение моего массива во время итерации (Javascript) - PullRequest
0 голосов
/ 09 апреля 2020

Извинения Я написал свой предыдущий вопрос немного поспешно, поэтому не смог правильно сформулировать его в правильном примере.

Проблема ниже несколько раз возникала, и я всегда застреваю. Мои знания о Javascript относятся только к начальному уровню.

Я хочу, чтобы мой список массивов изменялся и изменялся при его повторении. По сути, итерация по совершенно новому массиву, полученному из первой итерации.

arr = [ 1, 2, 1, 3, 4, 2, 4, 1, 2, 4 ]

if arr[n]== 1 and arr[n+1] == 2 || arr[n] == 3 || arr[n+1] == 4
then remove arr[n] and arr[n+1] and current index is +2 else
newarr.push[n] and current index is +1
Loop over

После выполнения вышеупомянутых l oop мы получаем:

newarr = [1, 2, 4, 4];

Теперь l oop проходит по этому новый массив с тем же условием. Мы получаем

newarr = [4,4];

Теперь, так как условие не может быть выполнено, мы вырываемся из l oop.

Надеюсь, что это яснее. Я пробовал все, но l oop всегда относится к исходному массиву, и я просто не знаю, как заставить его использовать результирующий массив. Это что-то, что можно сделать с помощью рекурсии или, может быть, методом сокращения?

Любой совет приветствуется. Благодаря.

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете использовать рекурсию.

Каждый раз, когда вы вызываете change_array(), вы передаете в качестве аргумента массив, который вы хотите изменить.

При первом вызове этой функции вы предоставляете оригинал массив. Эта функция создает новый массив, берет необходимые элементы из старого массива и снова вызывает себя с новым массивом в качестве параметра. Это продолжается до тех пор, пока в массив не будут внесены изменения.

Когда у вас есть рекурсивная функция у вас также должно быть условие, которое останавливает рекурсию, чтобы избежать бесконечных вызовов и переполнения стека.

В этом конкретном примере, если в массив не было внесено никаких изменений, поскольку не было найдено соответствующего элемента в соответствии с нашими критериями, мы прекращаем рекурсию в этой строке

if(!found_element){ return false;}

Вот полный код

var original_arr = [ 1, 2, 1, 3, 4, 2, 4, 1, 2, 4 ];
change_array(original_arr);

function change_array(arr){

var temp_array=[];
var found_element=false;

console.log(arr);

for(let i=0;i<arr.length;i++){

    if((arr[i]==1 && arr[i+1]==2 )|| (arr[i]==3 && arr[i+1]==4)){
        found_element=true;
        i++;
    }else{
        temp_array.push(arr[i]);
    }
}

if(!found_element){ return false;}

change_array(temp_array);

}

при выполнении возвращает

[1, 2, 1, 3, 4, 2, 4, 1, 2, 4]
[1, 2, 4, 4]
[4, 4]
...