Рекурсия и многомерные структуры в JavaScript

Дан массив многомерный произвольного уровня вложенности, например, такой:

let arr = [ 1, [ 2, 7, 8 ], [ 3, 4, [5, [6, 7]], ] ];

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

Пусть мы хотим вывести на экран все примитивные (то есть не массивы) элементы нашего массива. В этом случае для перебора такого массива у нас просто не получится использовать циклы, так как массив имеет неправильную структуру и неизвестный уровень вложенности.

Зато для перебора такого массива очень удобно будет использовать рекурсию.

Для начала сделаем функцию, в которую параметром будем передавать наш массив, а в функции сделаем цикл для перебора нашего массива:

function func(arr) { for (let elem of arr) { console.log(elem); } } func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);

Сделанный нами цикл будет перебирать только элементы основного массива. То есть вначале он выведет 1, потом [2, 7, 8], а потом [3, 4, [5, [6, 7]].

Давайте теперь будем разделять в цикле элементы-примитивы и элементы-массивы:

function func(arr) { for (let elem of arr) { if (typeof elem == 'object') { // элемент - массив } else { // элемент - примитив console.log(elem); } } } func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);

А теперь сделаем так, чтобы если наш элемент - массив, функция вызывала сама себя, передавая параметром этот массив:

function func(arr) { for (let elem of arr) { if (typeof elem == 'object') { func(elem); } else { console.log(elem); } } } func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);

Дан многомерный объект произвольного уровня вложенности, например, такой:

{a: 1, b: {c: 2, d: 3, e: 4}, f: {g: 5, j: 6, k: {l: 7, m: {n: 8, o: 9}}}}

С помощью рекурсии выведите все примитивные элементы этого объекта на экран.

Дан многомерный массив произвольного уровня вложенности, например, такой:

[1, [2, 7, 8], [3, 4, [5, [6, 7]]]]

Напишите код, который развернет наш многомерный массив в одномерный. Для приведенного выше массива это будет выглядеть вот так:

[1, 2, 7, 8, 3, 4, 5, 6, 7]

Сумма элементов массива

Давайте найдем сумму примитивных элементов нашего массива:

function func(arr) { let sum = 0; for (let elem of arr) { if (typeof elem == 'object') { sum += func(elem); } else { sum += elem; } } return sum; } console.log(func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]));

Дан многомерный объект произвольного уровня вложенности, например, такой:

{a: 1, b: {c: 2, d: 3, e: 4}, f: {g: 5, j: 6, k: {l: 7, m: {n: 8, o: 9}}}}

С помощью рекурсии найдите сумму элементов этого объекта.

Дан многомерный массив произвольного уровня вложенности, содержащий внутри себя строки, например, такой:

['a', ['b', 'c', 'd'], ['e', 'f', ['g', ['j', 'k']]]]

С помощью рекурсии слейте элементы этого массива в одну строку:

'abcdefgjk'

Манипуляции с элементами

Давайте что-нибудь сделаем с перебираемыми элементами массива, к примеру, запишем им в конец знак '!'.

В этом случае нам придется воспользоваться обычным циклом for, а не for-of, вот так:

function func(arr) { for (let i = 0; i < arr.length; i++) { if (typeof arr[i] == 'object') { arr[i] = func(arr[i]); } else { arr[i] = arr[i] + '!'; } } return arr; } console.log(func([1, [2, 7, 8], [3, 4, [5, 6]]]));

Дан многомерный массив произвольного уровня вложенности, например, такой:

[1, [2, 7, 8], [3, 4], [5, [6, 7]]]

Возведите все элементы-числа этого массива в квадрат.