多次元 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)); // "高い"