我在javascript中有两个数字。
它们是整体坐标。
我还有一个对象:var regions = {};
我希望能够尽快访问特定对象。
E.g。在(5,-2)
处可能有一个物体对于这样的两个数字,创建独特哈希的快速方法是什么,不会发生冲突?
答案 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)
我使用了两个函数encode
和decode
。
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键值。