Javascript Map() 通过身份比较对象键,这意味着 Map<[number, number], any> 是一个坏主意:
const map = new Map();
const coordinates = [1, 3];
map.set(coordinates, 0);
map.get([1, 3]);
# undefined
为了避免这种情况,我们通常将按键设置为
`${a}_${b}`
。这相当快,但它涉及数字到字符串的转换。如果我们知道 A 和 B 的范围,我们就可以做到 (a << 8) + b
,在我的测试中速度快了 2-3 倍:http://jsben.ch/JRG9z
对于具有未知域的整数,是否有类似的方法来对结果键的唯一性进行位移,但不涉及字符串转换?
对于具有未知域的整数,是否有类似的方法来对结果键的唯一性进行位移,但不涉及字符串转换?
不。具有未知域的整数至少携带 53 位信息,因此无法将两个整数放入单个 JS 数字(最多 64 位信息)而不发生冲突。
我通常为此使用嵌套对象。也可以替换为
map
(更多编码):
class CoordMap{
map = {};
set(coord, val){
(this.map[coord[0]] ??= {})[coord[1]] = val;
}
get(coord){
return this.map[coord[0]]?.[coord[1]];
}
}
const map = new CoordMap;
const coordinates = [1, 3];
map.set(coordinates, 0);
console.log(map.get([1, 3]));