JavaScriptでネストされたオブジェクトのキーを再帰的に検索・一覧表示する方法
JavaScriptでは、プロパティの値としてさらにオブジェクトを持つような、2〜3階層、あるいはそれ以上に深くネストされたオブジェクトを扱うことがあります。
以下はそのサンプルオブジェクトです。
const people = {
Ram: {
fullName: 'Ram Kumar',
details: {
age: 31,
isEmployed: true
}
},
Sourav: {
fullName: 'Sourav Singh',
details: {
age: 22,
isEmployed: false
}
},
Jay: {
fullName: 'Jay Grewal',
details: {
age: 26,
isEmployed: true
}
}
}実現したいこと
今回の課題は、このようなオブジェクトと文字列(キー名)を受け取り、オブジェクト全体を走査して指定された文字列と一致するキーを探し、一致したすべてのキーの値を配列として返す関数を作成することです。
関数名は recursiveSearch() としましょう。このように階層構造が深くなるケースでは、再帰処理が最も適したアプローチになります。
recursiveSearch() の完全なコード
const people = {
Ram: {
fullName: 'Ram Kumar',
details: {
age: 31,
isEmployed: true
}
},
Sourav: {
fullName: 'Sourav Singh',
details: {
age: 22,
isEmployed: false
}
},
Jay: {
fullName: 'Jay Grewal',
details: {
age: 26,
isEmployed: true
}
}
}
const recursiveSearch = (obj, searchKey, results = []) => {
const r = results;
Object.keys(obj).forEach(key => {
const value = obj[key];
if(key === searchKey && typeof value !== 'object'){
r.push(value);
}else if(typeof value === 'object'){
recursiveSearch(value, searchKey, r);
}
});
return r;
};
console.log(recursiveSearch(people, 'age'));出力結果
コンソールには次のように出力されます。
[ 31, 22, 26 ]
コードの解説
上記の関数では、まずメインのオブジェクトを反復処理します。そして、値がオブジェクトである箇所(ネスト)を見つけるたびに、そのサブオブジェクトに対して自分自身を再帰的に呼び出し、目的のキーを探し続けます。
目的のキーが見つかった場合は、その時点で値を results 配列に記録します。最後に、すべての走査が完了した時点で、目的の値が格納された results 配列を返します。
なお、typeof value !== 'object' のチェックにより、オブジェクト型の値を持つ同名のキーが誤って結果に含まれることを防いでいます。
計算量について
この関数の時間計算量は O(m×n) です。ここで n はメインオブジェクト内の子オブジェクトの数、m はネストの最深レベルを表します。
-
【JavaScript】配列内のネストされたオブジェクトの値を合計する方法
この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d
-
JavaScriptのObject.keys().map()とArray.map()の違いを徹底解説
JavaScriptにおいて、Array.map()は配列の各要素に関数を適用し、その結果を新しい配列として返すメソッドです。一方、オブジェクトには直接map()メソッドが用意されていないため、Object.keys().map()という形で、まずObject.keys()を使ってオブジェクトのキーを配列として取得し、そこにmap()を適用するのが一般的なテクニックとなります。 この記事では、両者の使い方の違いを、実際に動作するサンプルコードと実行結果をもとにわかりやすく解説します。 サンプルコード 以下は、Object.keys().map()とArray.map()の動作を比較できるJa