2016-05-08 53 views
0

我有两个数字在JavaScript中。Javascript哈希两个数字

它们是整体坐标。

我也有一个目标:var regions = {};

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

E.g.可能有一个对象在(5,-2)

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

+0

如何创建'regions'?一次一个字面,或增量? –

+0

@ T.J.Crowder,它是一个联网的应用程序,所以区域通过websockets发送。他们将成为阵列中的多个组。例如。一组区域可能在(0,0)左右,另一个区域可能在(500,20)等区域。 – Lolums

+0

那么你会得到一个你解析的大消息还是滴答滴答? –

回答

2

我假设您要访问的“特定对象”由regions上的属性引用。 JavaScript中的对象属性通过字符串名称或Symbol名称命名。在这种情况下你会使用字符串。

由于这将是由字符串,简单的解决方案仅仅是创建一个字符串,并与关注一下吧:

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

这使得它的JavaScript引擎,以做好仰视财产。 JavaScript引擎是非常好(阅读:快)在这,因为他们必须这样做很多

引擎如何执行查找将在某种程度上取决于如何创建regions对象。现代引擎将尽可能创建有效的微型对象,并提供属性名称的快速解析。如果您执行某些操作(例如在其中一个属性上使用delete),现代引擎可能会回退到“字典”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化后的形式那么快。

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

正如你所说的,你会收到点滴和单调的信息,我会用一个简单的复合字符串键直到/除非你有该解决方案的性能问题,然后看看试图获得连续的数组发生在你的目标引擎上(把那些负面的索引转换成别的东西,这可能是有问题的)。我怀疑你会发现查找是每个瓶颈。

0

实施例:

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

,然后,如果你有2号你可以很容易地生成密钥和访问对应的对象:

var x = 5; 
var y = -2; 
var obj = regions[x + ',' + y]; 
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可用作字典键值。

1

可以使用数组符号:

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

对象键不能是数组,所以下罩[5,-2]将字符串化到"5,-2"。但我认为使用数组符号比手动进行字符串化更为有效。

+0

创建一个数组只是为了创建一个字符串似乎相当迂回,尤其是。如果OP主要关注业绩(尽管我怀疑这个业务的表现不会成为主要关注的话)。 –

+0

@ T.J.Crowder我读到的不是串联字符串,而是最好创建一个数组并在最后加入它。但是,性能差异可能可以忽略不计。我更喜欢这种方式,因为它更漂亮。 – Oriol

+0

这是很久以前,并在多个连接的情况下(例如建立一个模板的东西)。在现代JavaScript引擎和特别的。只有一个连接,我相信这个开销并不值得。但当然要检查一个目标引擎。 –