Javascript Map() 从 [int, int] 创建可用键的最高效方法

问题描述 投票:0回答:2

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

对于具有未知域的整数,是否有类似的方法来对结果键的唯一性进行位移,但不涉及字符串转换?

javascript performance dictionary
2个回答
1
投票

对于具有未知域的整数,是否有类似的方法来对结果键的唯一性进行位移,但不涉及字符串转换?

不。具有未知域的整数至少携带 53 位信息,因此无法将两个整数放入单个 JS 数字(最多 64 位信息)而不发生冲突。


0
投票

我通常为此使用嵌套对象。也可以替换为

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]));

© www.soinside.com 2019 - 2024. All rights reserved.