Set.Has() 不适用于数组,因为它们是可变的。有什么替代方案吗?

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

我有一个(很多)坐标列表。

coordinateList = [[1,2], [2,1], [3,5]];

这个坐标是唯一的,因为我有很多坐标,所以我希望能够快速检查新坐标是否已在列表中,而无需在列表中搜索。因此,Set 是存储我的坐标并对它们进行哈希处理的完美数据类型。

let coordinateSet = new Set();
for (let coordinate of coordinateList) {
    coordinateSet.add(coordinate);
}

现在坐标集是一个包含坐标的集合。

但是,这些坐标被保存为两个元素的数组,该数组是可变的。因此,我无法检查该集合是否已经有坐标

coordinateSet.has([1,2])  --> false

我见过将数组转换为字符串以获得不变性的解决方案,但它看起来像是一种黑客,虽然它可能有效,但感觉不是解决该问题的正确方法。

如何存储我的坐标(2 个数字),使它们不可变,然后可以在集合中使用?是否有像元组这样的不可变的东西可以用于此目的?

javascript set immutability
1个回答
0
投票

字符串通常非常适合此解决方案,但对于大型集合可能效果不佳。如果这是您所关心的,您必须将其控制在数字范围内。我可以想到另外两个选择:

嵌套地图(2级:1级:x,2级:y)

const coordinateList = [[1, 2], [2, 1], [3, 5]];
const coordinateMap = new Map();

for (let [x, y] of coordinateList) {
  let ySet = coordinateMap.get(x);
  if (!ySet) {
    ySet = new Set();
    coordinateMap.set(x, ySet);
  }
  ySet.add(y);
}

function hasCoordinate(x, y) {
  const ySet = coordinateMap.get(x);
  return ySet ? ySet.has(y) : false;
}

console.log(hasCoordinate(1, 2)); // true
console.log(hasCoordinate(2, 3)); // false

另一个是构建一个哈希函数,但是......碰撞之类的东西,可能不值得。

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