哪种数据类型可以轻松查找一对字符串到一个字符串的有限映射
S X S |-> S ?
我希望以这种方式而不是函数来表示映射,以便使用简单的规则进行扩展。
我是否需要使用数组,例如
[ [[S1, S2], S3 ], [[S1, S3], S4 ], ...]
代表元组?这似乎使查找变得可怕。 。 。但我知道在ES6中键不能是对象,所以我没有别的办法看。
答案 0 :(得分:2)
嵌套地图(简单搜索树)提供了一个通用的解决方案:
const map = {
"one": {
"one": "11",
"two": "12"
},
"two": {
"one": "21",
"two": "22"
}
};
console.log(map["one"]["one"]); // "11"
console.log(map["one"]["two"]); // "12"
console.log(map["two"]["one"]); // "21"
console.log(map["two"]["two"]); // "22"
或者,您也可以将两个字符串连接成一个键。但您需要阻止"a" + "ab"
和"aa" + "b"
等关键冲突,例如通过在密钥前面加上第一个字符串的长度:
const map = {
"3:oneone": "11",
"3:onetwo": "12",
"3:twoone": "21",
"3:twotwo": "22"
}
function set(map, str1, str2, val) {
return map[str1.length + ":" + str1 + str2] = val;
}
function get(map, str1, str2) {
return map[str1.length + ":" + str1 + str2];
}
console.log(get(map, "one", "one")); // "11"
console.log(get(map, "one", "two")); // "12"
console.log(get(map, "two", "one")); // "21"
console.log(get(map, "two", "two")); // "22"
如果您不喜欢使用字符串长度作为前缀,您可以例如使用分隔符"a" + ":" + "ab"
但是需要转义两个字符串中的分隔符。就个人而言,我更喜欢上面所示的嵌套地图,因为它具有通用性和简洁性。