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]