JavaScript 2D数组查找速度极慢

时间:2018-07-23 23:26:54

标签: javascript arrays

我在JavaScript中有一个2D数组(500 x 500)来存储游戏地图,当我遍历所有元素时,它不需要时间。但是当我介绍这一行

let cell = map[i][j];

这花费了很多时间,因为它总共必须查找250000个索引。当您根本没有查找任何索引时,该循环需要40毫秒才能完成,而不是几乎为零,那么我该如何加快这一过程?

编辑:

我对数组的解释不是很好,所以这里有更多信息

var map = new Array(500); 
for (var i = -500 / 2; i < 500 / 2; i ++) { 
   map[i] = new Array(500); 
}

这是用来创建地图的,当我想在30、10处放置一块石头时,我只能使用map[30][10] = 4(4是一块石头的ID)

for (let i = -500 / 2; i < 500 / 2; i ++) {
   for (let j = -500 / 2; j < 500 / 2; j ++) {
      cell = map[i][j];

用于遍历数组,然后可以检查索引是否包含对象以及播放器是否应与之碰撞。

1 个答案:

答案 0 :(得分:2)

问题可能是由于您使用了负索引。

JavaScript数组本质上是对象,而数组索引只是其键为整数的属性。但是,它们经过优化,可以处理从0开始的顺序整数的正常情况-它们存储在顺序存储器中,类似于在C等传统语言中实现数组的方式。

当您访问不是非负索引的数组索引时,会将其视为普通对象属性。这比普通的数组索引效率低得多,它需要将索引转换为字符串并对其进行哈希处理。

如果要将数组视为具有从-250249的索引,请在将它们用作索引之前将250添加到ij

var map = new Array(500); 
for (var i = -500 / 2; i < 500 / 2; i ++) { 
   map[i+250] = new Array(500); 
}
for (let i = -500 / 2; i < 500 / 2; i ++) {
   for (let j = -500 / 2; j < 500 / 2; j ++) {
      cell = map[i+250][j+250];
    }
}