はじめに
この実験では、再帰を使って与えられたオブジェクトのすべてのキーを辿るジェネレータ関数を作成する概念を探ります。この実験の目的は、学習者に対して、yield と yield* 式を for...of ループと Object.keys() と組み合わせてオブジェクトのキーとその値を反復処理する方法を理解するための実践的な経験を提供することです。この実験が終了するまでに、学習者はオブジェクトを再帰的に辿り、現在のパスを表すキーの配列と対応する値を生成する方法を実際に理解するようになります。
オブジェクトのキーを辿るコード
与えられたオブジェクトのすべてのキーのリストを生成するには、次の手順を使用します。
ターミナル/SSH を開き、コーディングを練習するために
nodeと入力します。オブジェクトとキーの配列を受け取る
walkと呼ばれるジェネレータ関数を定義します。再帰を使ってオブジェクトのすべてのキーを辿ります。walk関数の中で、for...ofループとObject.keys()を使ってオブジェクトのキーを反復処理します。typeofを使って、与えられたオブジェクトの各値がそれ自体オブジェクトであるかどうかを確認します。値がオブジェクトの場合、yield*式を使って同じジェネレータ関数walkに再帰的に委譲し、現在のkeyをキーの配列に追加します。それ以外の場合、現在のパスを表すキーの配列と与えられた
keyの値をyieldします。yield*式を使ってwalkジェネレータ関数に委譲します。
以下がコードです。
const walkThrough = function* (obj) {
const walk = function* (x, previous = []) {
for (let key of Object.keys(x)) {
if (typeof x[key] === "object") yield* walk(x[key], [...previous, key]);
else yield [[...previous, key], x[key]];
}
};
yield* walk(obj);
};
コードをテストするには、オブジェクトを作成し、walkThrough 関数を使ってそのすべてのキーのリストを生成します。
const obj = {
a: 10,
b: 20,
c: {
d: 10,
e: 20,
f: [30, 40]
},
g: [
{
h: 10,
i: 20
},
{
j: 30
},
40
]
};
[...walkThrough(obj)];
/*
[
[['a'], 10],
[['b'], 20],
[['c', 'd'], 10],
[['c', 'e'], 20],
[['c', 'f', '0'], 30],
[['c', 'f', '1'], 40],
[['g', '0', 'h'], 10],
[['g', '0', 'i'], 20],
[['g', '1', 'j'], 30],
[['g', '2'], 40]
]
*/
まとめ
おめでとうございます!あなたはオブジェクトを辿る実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を練習することができます。