JSON は使いやすいフォーマットですが、近年何でも JSON フォーマットで表すため、階層化されて複雑な JSON データにでくわすことがあります。例えばこのような感じ。
{
"title" : "name",
"map" : {
"mtitle1" : "mval1",
"mtitle2" : "mval2"
},
"mid title" : "mvalue",
"array" : [
{"atitle1": "aval1", "atitle2": "aval2"},
{"btitle1": "bval1", "btitle2": "bval2"}
],
"end title" : "evalue"
}
このように、連想配列や通常の配列が混在していると、読み込むにはひと手間かかります。そこで、再帰的に一気に読み込みたいと思い、下記のようなコードを作成。
function plotres(response, prefix) {
for (var key in response){
if (typeof response[key] == "object") {
if(Array.isArray(response[key])) {
// 配列の場合は forEach で要素ごとにに再帰呼び出し
response[key].forEach(function(item){
plotres(item, prefix+" "+key) ;
});
} else {
// 連想配列はそのまま再帰呼び出し
plotres(response[key], prefix+" "+key) ;
}
} else {
// 配列や連想配列でなければキーの値を表示
console.log(prefix+" "+key+": "+response[key]);
}
}
}
階層化されるごとに、その前の key をスペースで表示するようにしています。下記が実行結果。
> plotres(res, "")
title: name
map mtitle1: mval1
map mtitle2: mval2
mid title: mvalue
array atitle1: aval1
array atitle2: aval2
array btitle1: bval1
array btitle2: bval2
end title: evalue
うまく再帰的に読み込むことができました。