我有两个数字在JavaScript中。Javascript哈希两个数字
它们是整体坐标。
我也有一个目标:var regions = {};
我希望能够尽快访问特定对象越好。
E.g.可能有一个对象在(5,-2)
对于这样的两个数字创建独特的哈希,不冲突的快速方法是什么?
我有两个数字在JavaScript中。Javascript哈希两个数字
它们是整体坐标。
我也有一个目标:var regions = {};
我希望能够尽快访问特定对象越好。
E.g.可能有一个对象在(5,-2)
对于这样的两个数字创建独特的哈希,不冲突的快速方法是什么?
我假设您要访问的“特定对象”由regions
上的属性引用。 JavaScript中的对象属性通过字符串名称或Symbol
名称命名。在这种情况下你会使用字符串。
由于这将是由字符串,简单的解决方案仅仅是创建一个字符串,并与关注一下吧:
var obj = regions[num1 + "," + num2];
这使得它的JavaScript引擎,以做好仰视财产。 JavaScript引擎是非常好(阅读:快)在这,因为他们必须这样做很多。
引擎如何执行查找将在某种程度上取决于如何创建regions
对象。现代引擎将尽可能创建有效的微型对象,并提供属性名称的快速解析。如果您执行某些操作(例如在其中一个属性上使用delete
),现代引擎可能会回退到“字典”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化后的形式那么快。
我怀疑你会找到一个更快捷的方式。理论上,如果region
是一个连续数组,其中元素引用了连续数组,JavaScript引擎可以使这些数组成为真正的数组,并且您的示例数字之一是负数,这将阻止使用真数组。而且你仍然在做两个查找(第一个数字,然后是第二个数字),并且不能保证它会更快。它肯定会更复杂。
正如你所说的,你会收到点滴和单调的信息,我会用一个简单的复合字符串键直到/除非你有该解决方案的性能问题,然后看看试图获得连续的数组发生在你的目标引擎上(把那些负面的索引转换成别的东西,这可能是有问题的)。我怀疑你会发现查找是每个瓶颈。
实施例:
var regions = {
'5,-2': { ... },
'1,3': { ... }
};
,然后,如果你有2号你可以很容易地生成密钥和访问对应的对象:
var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
我使用了两个功能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
可用作字典键值。
可以使用数组符号:
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
对象键不能是数组,所以下罩[5,-2]
将字符串化到"5,-2"
。但我认为使用数组符号比手动进行字符串化更为有效。
创建一个数组只是为了创建一个字符串似乎相当迂回,尤其是。如果OP主要关注业绩(尽管我怀疑这个业务的表现不会成为主要关注的话)。 –
@ T.J.Crowder我读到的不是串联字符串,而是最好创建一个数组并在最后加入它。但是,性能差异可能可以忽略不计。我更喜欢这种方式,因为它更漂亮。 – Oriol
这是很久以前,并在多个连接的情况下(例如建立一个模板的东西)。在现代JavaScript引擎和特别的。只有一个连接,我相信这个开销并不值得。但当然要检查一个目标引擎。 –
如何创建'regions'?一次一个字面,或增量? –
@ T.J.Crowder,它是一个联网的应用程序,所以区域通过websockets发送。他们将成为阵列中的多个组。例如。一组区域可能在(0,0)左右,另一个区域可能在(500,20)等区域。 – Lolums
那么你会得到一个你解析的大消息还是滴答滴答? –