JavaScriptにおける再帰と多次元構造

例えば次のような、任意のレベルのネストを持つ 多次元配列があるとします:

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

この配列は複雑な構造を持ち、その構造は任意であり、 ネストのレベルはいくらでも深くなる可能性があると 想定されています。

この配列のすべてのプリミティブ(つまり配列ではない) 要素をコンソールに出力したいとします。 この場合、配列が不規則な構造でネストのレベルが 不明であるため、このような配列を走査するために 単純なループを使うことはできません。

しかし、このような配列を走査するには再帰を 使用すると非常に便利です。

まず、パラメータとしてこの配列を受け取り、 関数内で配列を走査するためのループを作成する 関数を作成します:

javascriptfunction 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]] を 出力します。

次に、ループ内でプリミティブ要素と配列要素を 区別するようにします:

javascriptfunction 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]]]]);

そして、要素が配列である場合、関数がその配列を パラメータとして渡して自分自身を呼び出すように します:

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

例えば次のような、任意のレベルのネストを持つ 多次元オブジェクトがあるとします:

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

再帰を使用して、このオブジェクトのすべての プリミティブ要素をコンソールに出力してください。

Задание 2

例えば次のような、任意のレベルのネストを持つ 多次元配列があるとします:

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

多次元配列を一次元配列に変換するコードを 作成してください。上記の配列の場合、 結果は次のようになります:

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