Создайте функцию, которая вычисляет сумму всех чисел в зубчатом массиве.

Мы собираемся написать функцию с именем sumArray, которая будет принимать массив ar в качестве аргумента.

Для этой функции вам дается зубчатый массив. Неровный массив - это массив, содержащий комбинацию чисел и других массивов. Массивы могут иметь многоуровневую глубину.

Цель функции - найти сумму всех чисел внутри зубчатого массива.

Пример:

let ar = [1, 2, [15, [23], [5, 12]], [100]];
//output: 158

Затем мы найдем способ заставить нашу функцию пройти через все внутренние массивы, чтобы получить нашу сумму. Одна из ключевых функций для этого - рекурсия.

Первое, что мы сделаем, - это создадим переменную с именем sum и присвоим ей значение 0. Это переменная, которую мы вернем в конце функции.

let sum = 0;

Затем мы будем использовать цикл for для просмотра нашего массива:

for(let el of ar){        
    if (Array.isArray(el)){            
        el = sumArray(el);        
    }        
        sum += el;    
}

Посмотрим, что происходит внутри цикла for.

В нашем первом операторе if мы проверяем, является ли текущий повторяемый элемент массивом, используя метод Array.isArray(). Если это массив, мы используем рекурсию, чтобы снова подключить этот массив к нашей функции. Это будет рекурсивно переходить на сколько угодно уровней в глубину массива, пока мы не зайдем в тупик на каком-то числе.

Используя наш пример, приведенный выше, я нарисую, что происходит.

[1, 2, [15, [23], [5, 12]], [100]]

Первый и второй элементы являются числами, поэтому они добавляются к нашей переменной sum, но наш третий элемент - это массив.

[15, [23], [5, 12]]

Мы используем рекурсию, чтобы перейти на следующий уровень вглубь нашего основного массива. Когда этот массив переходит в цикл for, первый элемент добавляется к нашему sum. Но мы снова сталкиваемся с другим массивом во втором элементе, поэтому мы используем рекурсию, чтобы перейти на следующий уровень.

Теперь мы на трех уровнях.

[23]

Поскольку в этом массиве есть только один элемент, который не является массивом, мы добавляем это число в наш sum и возвращаемся на второй уровень нашего основного массива.

[15, [23], [5, 12]]

Цикл for переходит к следующему элементу, который также является массивом.

[5, 12]

Мы рекурсивно переходим к массиву, просматриваем его и добавляем 5 и 12 в sum.

Функция возвращается на первый уровень основного массива и переходит к следующему элементу, равному [100].

[1, 2, [15, [23], [5, 12]], [100]]

Мы используем рекурсию, чтобы вернуться ко второму уровню нашего основного массива снова. Как только мы входим в цикл for, мы добавляем 100 к sum.

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

Это переключение между уровнями продолжается до тех пор, пока функция, наконец, не достигнет первого уровня нашего основного массива и не достигнет конца.

Когда цикл for заканчивается, мы возвращаем наш sum.

Вот остальная часть функции:

Если вы нашли этот алгоритм полезным, ознакомьтесь с другими моими статьями о решениях для алгоритмов JavaScript: