Havascript两个数字的Javascript

时间:2016-05-08 13:51:33

标签: javascript hash lookup

我在javascript中有两个数字。

它们是整体坐标。

我还有一个对象:var regions = {};

我希望能够尽快访问特定对象。

E.g。在(5,-2)

处可能有一个物体

对于这样的两个数字,创建独特哈希的快速方法是什么,不会发生冲突?

4 个答案:

答案 0 :(得分:2)

我假设"特定对象"您想要访问的内容由regions上的属性引用。 JavaScript中的对象属性由字符串名称或Symbol名称命名。在这种情况下,你正在使用字符串。

因为它将成为字符串,所以简单的解决方案就是创建一个字符串,并用它来查找:

var obj = regions[num1 + "," + num2];

这使得JavaScript引擎能够很好地查找属性。 JavaScript引擎非常好(读取:快速),因为他们必须很多

引擎如何进行查找将在某种程度上取决于regions对象的创建方式。只要有可能,现代引擎将创建有效微类的对象,并提供非常快速的属性名称解析。如果你做某些事情(比如在其中一个属性上使用delete),现代引擎可能会回到"字典"模式,它使用哈希查找。这仍然很快,不如优化形式快。

我怀疑你会找到更快捷的方法。理论上,如果region是一个连续的数组,其中元素引用了连续的数组,那么JavaScript引擎可以在封面下创建这些真正的数组,并且您的一个示例数字是负数,这将阻止使用真正的数组。你仍然在做两次查询(第一个数字,然后是第二个),并且不能保证它会更快。这肯定会更复杂。

正如您所说的那样,您会收到一些简单的复合字符串密钥,直到/除非您遇到该解决方案的性能问题,然后再看一下试图让你的目标引擎上发生连续的数组(将这些负面索引转换成其他东西,这可能会有问题)。我怀疑你是否发现查找是每个瓶颈。

答案 1 :(得分:1)

您可以使用数组表示法:

var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject

对象键不能是数组,因此引擎[5,-2]将字符串化为"5,-2"。但我认为使用数组表示法比手动字符串化更美观。

答案 2 :(得分:0)

示例:

var regions = {
    '5,-2': { ... },
    '1,3': { ... }
};

然后如果您有2个数字,则可以轻松生成密钥并访问相应的对象:

var x = 5;
var y = -2;
var obj = regions[x + ',' + y];

答案 3 :(得分:0)

我使用了两个函数encodedecode

var x = 10;
var y = -3.2;

function encode(x, y) {
  return x + ',' + y;
}

function decode(code) {
  var xy = code.split(',');
  return [+xy[0], +xy[1]];
}

var code = encode(x, y);
console.log(code);
var xy = decode(code);
console.log(xy);

code可用作dict键值。