JavaScript 連想配列(オブジェクト)ツリーに対する複合キーのサンプル
単純な話ですが、データ取得にハマったので、備忘録としてサンプルをメモしておきます。
サンプルデータ
var testMap =({ "depth1-a": { "depth2-a": { "depth3-x": "1", "depth3-y": "2" }, "depth2-b": { "depth3-z": "3" } }, "depth1-b": "depth1-value" });
普通に取得しようとすると‥
こんな具合になります。(こうですよね?)
実行結果(正常ケース)
console.log(testMap["depth1-a"]["depth2-a"]["depth3-x"]); 1
実行結果(深さ違い、キー不一致)
console.log(testMap["depth1-b"]["depth2-a"]["depth3-x"]); VM1132:1 Uncaught TypeError: Cannot read property 'depth3-x' of undefined(…)
実行結果(キー不一致)
console.log(testMap["depth1-X"]["depth2-a"]["depth3-x"]); VM1133:1 Uncaught TypeError: Cannot read property 'depth2-a' of undefined(…)
内包オブジェクトの深さが異なる、または一部のキーが一致しない場合、途中にundefinedを挟むケースが生じる為、例外が発生して都合が悪いです。
深さに関係なく、一律にundefinedが帰ってくると嬉しいなーと。
探し方が悪いのか、良いサンプルが見つからないので書いてみた。
function getValue(map, keyArray) { for (var i = 0; i < keyArray.length; i++) { var key = keyArray[i]; map= map[key]; if(map == undefined) { return undefined; } } return map; };
実行結果(正常ケース)
getValue(testMap, ["depth1-a","depth2-a","depth3-x"]); "1"
getValue(testMap, ["depth1-a","depth2-b","depth3-z"]); "3"
実行結果(異常ケース)
getValue(testMap, ["depth1-b","depth2-a","depth3-x"]); undefined
getValue(testMap, ["depth1-X","depth2-a","depth3-x"]); undefined