https://naba-san.hatenablog.com/


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