Рекурсия и многомерные структуры в 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]