Javascript散列两个数字
我有两个javascript数字 它们是积分坐标 我还有一个对象:Javascript散列两个数字,javascript,hash,lookup,Javascript,Hash,Lookup,我有两个javascript数字 它们是积分坐标 我还有一个对象:var regions={} 我希望能够尽快访问特定对象 例如,(5,-2)处可能有一个物体 对于这样的两个数字,如何快速创建不冲突的唯一哈希?示例: var regions = { '5,-2': { ... }, '1,3': { ... } }; 然后,如果您有2个数字,您可以轻松生成密钥并访问相应的对象: var x = 5; var y = -2; var obj = regions[x + ',' +
var regions={}代码>
我希望能够尽快访问特定对象
例如,(5,-2)处可能有一个物体
对于这样的两个数字,如何快速创建不冲突的唯一哈希?示例:
var regions = {
'5,-2': { ... },
'1,3': { ... }
};
然后,如果您有2个数字,您可以轻松生成密钥并访问相应的对象:
var x = 5;
var y = -2;
var obj = regions[x + ',' + y];
例如:
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
可以用作dict键值。我使用了两个功能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键值。我假设要访问的“特定对象”由区域上的属性引用。JavaScript中的对象属性通过字符串名称或Symbol
名称命名。在这种情况下,您将使用字符串
因为它将是按字符串进行的,所以简单的解决方案是创建一个字符串,并使用以下内容进行查找:
var obj = regions[num1 + "," + num2];
这就让JavaScript引擎能够很好地查找属性。JavaScript引擎在这方面做得非常好,因为它们必须做很多事情
引擎如何进行查找在某种程度上取决于区域
对象的创建方式。只要有可能,现代引擎将创建有效的微类对象,并提供非常快速的属性名称解析。如果您执行某些操作(例如对其中一个属性使用delete
),现代引擎可能会退回到“dictionary”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化表单快
我怀疑你能找到一个更快的方法。理论上,如果region
是一个连续数组,其中元素引用了连续数组,那么JavaScript引擎可以将这些真实数组隐藏起来,并且您的一个示例数字为负数,这将阻止使用真实数组。你仍然会做两次查找(第一个数字,然后是第二个),但不能保证它会更快。这肯定会更加复杂
正如您所说的那样,您将一点一滴地接收信息,我将使用一个简单的复合字符串键,直到/除非您的解决方案出现性能问题,然后查看如何在目标引擎上实现连续数组(将这些负索引转换为其他索引,这可能会有问题)。我怀疑您是否会发现查找是每个瓶颈。我假设您要访问的“特定对象”由区域上的属性引用。JavaScript中的对象属性通过字符串名称或Symbol
名称命名。在这种情况下,您将使用字符串
因为它将是按字符串进行的,所以简单的解决方案是创建一个字符串,并使用以下内容进行查找:
var obj = regions[num1 + "," + num2];
这就让JavaScript引擎能够很好地查找属性。JavaScript引擎在这方面做得非常好,因为它们必须做很多事情
引擎如何进行查找在某种程度上取决于区域
对象的创建方式。只要有可能,现代引擎将创建有效的微类对象,并提供非常快速的属性名称解析。如果您执行某些操作(例如对其中一个属性使用delete
),现代引擎可能会退回到“dictionary”模式,在该模式下使用哈希查找。这仍然很快,只是没有优化表单快
我怀疑你能找到一个更快的方法。理论上,如果region
是一个连续数组,其中元素引用了连续数组,那么JavaScript引擎可以将这些真实数组隐藏起来,并且您的一个示例数字为负数,这将阻止使用真实数组。你仍然会做两次查找(第一个数字,然后是第二个),但不能保证它会更快。这肯定会更加复杂
正如您所说的那样,您将一点一滴地接收信息,我将使用一个简单的复合字符串键,直到/除非您的解决方案出现性能问题,然后查看如何在目标引擎上实现连续数组(将这些负索引转换为其他索引,这可能会有问题)。我怀疑您是否会发现查找是每个瓶颈。您可以使用数组表示法:
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
对象键不能是数组,因此引擎盖下的[5,-2]
将被字符串化为“5,-2”
。但我认为使用数组表示法比手动字符串化更漂亮。您可以使用数组表示法:
var regions = {}
regions[[5,-2]] = myObject;
regions[[5,-2]]; // myObject
对象键不能是数组,因此引擎盖下的[5,-2]
将被字符串化为“5,-2”
。但我认为使用数组表示法比手动字符串化更漂亮。如何创建区域
?这是一个网络应用程序,所以这些区域通过WebSocket发送。它们将是阵列中的多个组。例如,一组区域可能在(0,0)左右,另一组可能在(500,20)左右等等。因此,您是否收到您解析的一条重要消息,或点点滴滴?@T.J.Crowder点点滴滴。一次发送一个包含坐标的对象,然后存储。注意:在一般计算机科学术语中,“不是唯一的,只是可复制的(即,相同的值总是产生相同的散列,但两个不同的值可能产生相同的散列)。使用此定义,x^y
是一个完全有效的散列。如何创建区域?一点也不