多次元 Map

HTML

<ul>
 <li><a href="https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2">multidimensional-map.js : 多次元Mapを生成 - Gist</a></li>
<li><a href="https://teratail.com/questions/84834#reply-132819">C# - 適切な分岐処理について(84834)|teratail</a></li>
</ul>

JavaScript

/**
 * multidimensional-map.js
 *
 * @version 1.0.0
 * @author think49
 * @url https://gist.github.com/think49/00326b750d48f5f9c48a042f1b19a1c2
 * @license http://www.opensource.org/licenses/mit-license.php (The MIT License)
 */

function createMultidimensionalMap (mapData) {
  'use strict';
  var rootMap;

  {
    var entry = mapData[0],
        keys = entry[0],
        keysIndex = keys.length - 1;

    rootMap = new Map([[keys[keysIndex], entry[1]]]);

    while (keysIndex--) {
      rootMap = new Map([[keys[keysIndex], rootMap]]);
    }
  }


  for (var i = 1, len = mapData.length, entry, keys, keysIndex, keysLen, map, newMap; i < len; ++i) {
    entry = mapData[i];
    keys = entry[0];
    keysLen = keys.length;

    if (keysLen > 1) {
      map = rootMap;

      for (var j = 0, key; j < keysLen; ++j) {
        key = keys[j];

        if (!map.has(key)) {
          break;
        } else {
          map = map.get(key);
        }
      }

      keysIndex = keys.length - 1;
      newMap = j !== keysIndex ? new Map([[keys[keysIndex], entry[1]]]) : entry[1];

      while (--keysIndex > j) {
        newMap = new Map([[keys[keysIndex], newMap]]);
      }

      map.set(keys[j], newMap);
    } else if (keysLen === 1) {
      rootMap.set(keys[0], entry[1]);
    }
  }

  return rootMap;
}


'use strict';
var map = createMultidimensionalMap([
            [[false, false], '低い'],
            [[false, true], '普通'],
            [[true, false], 'やや高い'],
            [[true, true], '高い']
          ]);

console.log(map);
console.log(map.get(false).get(false)); // "低い"
console.log(map.get(false).get(true));  // "普通"
console.log(map.get(true).get(false));  // "やや高い"
console.log(map.get(true).get(true));   // "高い"