多次元 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';
function createFunction (rules) {
  var keys = [...rules[0][0].keys()],
      hasOwnProperty = Object.prototype.hasOwnProperty;

  for (var i = 0, len = rules.length, rule; i < len; ++i) {
    rule = rules[i];
    rule[0] = [...rule[0].values()];
  }

  rules = createMultidimensionalMap(rules);

  return function getImportance3 (conditions) {
    var map = rules;

    for (var i = 0, len = keys.length, key; i < len; ++i) {
      key = keys[i];

      if (!hasOwnProperty.call(conditions, key)) {
        throw new ReferenceError;
      }

      map = map.get(conditions[key]);
    }

    return map;
  };
}

var rules = [
              [new Map([['A', false], ['B',...