Rekursija ir daugiamatės struktūros JavaScript
Duotas daugiamatis masivas savavališko lygio įdėjimo, pavyzdžiui, toks:
let arr = [
1,
[
2, 7, 8
],
[
3, 4, [5, [6, 7]],
]
];
Kaip matote, šis masivas turi sudėtingą struktūrą, ir daroma prielaida, kad ši struktūra gali būti savavališka, o įdėjimo lygiai gali būti bet kokio gylio.
Tarkime, norime išvesti į konsolę visus primityvius (tai yra ne masyvus) mūsų masivo elementus. Šiuo atveju, norint iteruoti tokį masyvą, mums tiesiog nepavyks naudoti ciklų, nes masivas turi netaisyklingą struktūrą ir nežinomą įdėjimo lygį.
Tačiau tokio masyvo iteravimui labai patogu būtų naudoti rekursiją.
Pirmiausia sukurkime funkciją, į kurią parametru perduosime mūsų masyvą, o funkcijoje sukurkime ciklą mūsų masyvo iteravimui:
function func(arr) {
for (let elem of arr) {
console.log(elem);
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
Mūsų sukurtas ciklas iteruos tik per
pagrindinio masyvo elementus. Tai yra, iš pradžių
jis išves 1, paskui [2, 7, 8],
o po to [3, 4, [5, [6, 7]].
Dabar cikle skirkime primityvius elementus ir masyvus:
function func(arr) {
for (let elem of arr) {
if (typeof elem == 'object') {
// elementas - masyvas
} else {
// elementas - primityvas
console.log(elem);
}
}
}
func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);
O dabar padarykime taip, kad jei mūsų elementas - masyvas, funkcija iškviestų pati save, perduodama parametru šį masyvą:
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]]]]);
Duotas daugiamatis objektas savavališko lygio įdėjimo, pavyzdžiui, toks:
{a: 1, b: {c: 2, d: 3, e: 4}, f: {g: 5, j: 6, k: {l: 7, m: {n: 8, o: 9}}}}
Naudodamiesi rekursija, išveskite visus primityvius šio objekto elementus į konsolę.
Duotas daugiamatis masyvas savavališko lygio įdėjimo, pavyzdžiui, toks:
[1, [2, 7, 8], [3, 4, [5, [6, 7]]]]
Parašykite kodą, kuris išskleis mūsų daugiamatį masyvą į vienmatį. Pateiktam aukščiau masyvui tai atrodys taip:
[1, 2, 7, 8, 3, 4, 5, 6, 7]