Rekursioon ja mitmemõõtmelised struktuurid JavaScriptis

Antud on mitmemõõtmeline massiiv suvalise pesastustasemega, näiteks selline:

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

Nagu näete, on sellel massiivil keeruline struktuur, eeldades, et see struktuur võib olla suvaline ja pesastustasemed võivad olla ükskõik kui sügavad.

Oletame, et soovime konsooli väljastada kõik primitiivsed (st mitte massiivid) meie massiivi elemendid. Sellisel juhul ei õnnestu meil sellise massiivi läbimiseks kasutada tsükleid, kuna massiivil on ebaregulaarne struktuur ja teadmata pesastustase.

Kuid sellise massiivi läbimiseks on väga mugav kasutada rekursiooni.

Alustuseks loome funktsiooni, kuhu parameetrina edastame oma massiivi, ja funktsiooni sees teeme tsükli meie massiivi läbimiseks:

javascriptfunction func(arr) {
  for (let elem of arr) {
    console.log(elem);
  }
}

func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);

Meie poolt loodud tsükkel läbib ainult põhimassiivi elemendid. See tähendab, et alguses väljastab see 1, siis [2, 7, 8], ja seejärel [3, 4, [5, [6, 7]].

Teeme nüüd tsüklis vahet primitiivsetel elementidel ja massiivi elementidel:

javascriptfunction func(arr) {
  for (let elem of arr) {
    if (typeof elem == 'object') {
      // element on massiiv
    } else {
      // element on primitiiv
      console.log(elem);
    }
  }
}

func([1, [2, 7, 8], [3, 4, [5, [6, 7]]]]);

Ja nüüd teeme nii, et kui meie element on massiiv, siis funktsioon kutsuks iseennast välja, edastades parameetrina selle massiivi:

javascriptfunction 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]]]]);
Задание 1

Antud on mitmemõõtmeline objekt suvalise pesastustasemega, näiteks selline:

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

Kasutades rekursiooni, väljastage kõik primitiivsed selle objekti elemendid konsooli.

Задание 2

Antud on mitmemõõtmeline massiiv suvalise pesastustasemega, näiteks selline:

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

Kirjutage kood, mis muudab meie mitmemõõtmelise massiivi ühemõõtmeliseks. Antud massiivi puhul näeb see välja järgmine:

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