【发布时间】:2014-10-31 22:07:37
【问题描述】:
我目前正在从事一个私人方面/有趣的项目,这是一个基于javascript 和jQuery 的小型浏览器游戏。
对于这个游戏,我将数据保存到对象数组中:
this.map.push(
{
"id" : id,
"x" : pos_x,
"y" : pos_y
}
);
现在我需要非常频繁地(“实时”)查找和/或更新此数组中的数据。
例如,当我需要在我的坐标系统的某个位置找到数组索引时,我正在使用jQuery 的$.each() 函数:
this.getIndexAtPos = function(x, y)
{
var index = false;
$.each(this.map, function(key, obj){
if(obj.x == x && obj.y == y)
{
index = key;
return false;
}
});
return index;
}
另一个例子:当我需要更新具有特定 id 的对象的数据时,我使用jQuery 的$.map() 函数:
this.updateCoordsById = function(id, x, y)
{
this.map = $.map(this.map, function(obj, i)
{
if(obj.id == id)
{
//only update x, y!
obj.x = x;
obj.y = y;
return obj;
}
else
{
return obj;
}
});
}
到目前为止,这一切对我来说都很好,但是我在一台相当快的计算机上,随着游戏的扩展,这些动作将会越来越多。比如说每秒有几百个$.each 和$.map 调用。
这就是为什么我担心性能问题,尤其是在速度较慢的计算机上。
我的问题:
我知道$.each 和$.map 在每次调用时(部分或全部)迭代我的数组。这就是为什么我一发现条目就在我的$.each 函数中使用return false; 以加快速度。
1.我可以通过使用其他jQuery函数或改变我使用它们的方式来提高性能吗?
2.有没有更好的方法(性能wise) 使用本机javascript 来解决这个问题?
3.我应该使用其他数据类型/结构来提高性能吗?
注意: 我需要实现的过程总是非常相似:通过 coords(x, y) 在数组中查找对象;通过 id 找到它们;通过 coords(x, y) 更新对象;按 id 更新对象,等等。
我将不胜感激任何帮助、意见和建议!
【问题讨论】:
-
我认为这归结于你的数据结构,而不是你用来访问它的函数。我是否正确假设您的地图是(希望是矩形的)网格 i 宽且 j 高,并且在任何时候都只能在 (x,y) 处有一个对象?
-
@Rhumborl 是的,没错。
-
1 - 没有。 2 - 是(原生 JS 总是比 jQuery 快)。 3 - 是的,当然。你能想到吗?
-
@Bergi 我喜欢“否/是”的答案,它们很有建设性。
-
是的,用于高效按位置查找的对象的二维数组和将 id 映射到用于高效按 id 查找的对象的对象会做得更好。试试看!
标签: javascript jquery arrays json performance