用于常量字符串映射的Javascript数据结构?

时间:2017-11-25 01:04:41

标签: javascript ecmascript-6

哪种数据类型可以轻松查找一对字符串到一个字符串的有限映射

S X S |-> S ?

我希望以这种方式而不是函数来表示映射,以便使用简单的规则进行扩展。

我是否需要使用数组,例如

[ [[S1, S2], S3 ], [[S1, S3], S4 ], ...] 

代表元组?这似乎使查找变得可怕。 。 。但我知道在ES6中键不能是对象,所以我没有别的办法看。

1 个答案:

答案 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"但是需要转义两个字符串中的分隔符。就个人而言,我更喜欢上面所示的嵌套地图,因为它具有通用性和简洁性。

相关问题