创建具有大索引的JavaScript数组的好方法是什么?

时间:2014-02-12 23:57:21

标签: javascript arrays performance

我正在创建一个Web应用程序,其中用户从PHP获取数据,并且数据由MySQL行组成,因此我想将已使用的数据保存在全局变量中,类似于缓冲区,以防止额外的AJAX请求。

我现在正在这样做:

window.ray = []; // global variable
$(function(){
   data = getDataWithAjax(idToSearch);
   window.ray[data.id] = data.text;
});

但是当id很大时,现在说10,window.ray就变成了这个:

,,,,,,,,42

所以它包含9个不必要的点。或者是吗?它只在我正在console.log(window.ray);

时才可见

如果效率低下,我想找到像PHP这样的方法,我只能指定我想要的索引,例如:

$array['420'] = "abc";
$array['999'] = "xyz";

我目前的方式是否与PHP一样有效,或者它实际上是否包含不必要的内存点?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

使用对象而不是数组。该对象将允许您使用id作为键,并且对于非顺序id值更有效。

window.ray = {}; // global variable
$(function(){
   data = getDataWithAjax(idToSearch);
   window.ray[data.id] = data.text;
});

然后,您可以通过ID访问任何元素:

var text = window.ray[myId];

答案 1 :(得分:0)

如果直接按属性名称分配值,则无论使用数组还是对象,它在性能方面都没有任何区别。数组的属性名称是字符串,就像对象一样。

以下内容:

var a = [];
a[1000] = 'foo';

然后a是(引用)一个长度为1,001的数组(总是至少比最高索引大一个),但它只有一个数字成员,一个名为'1000',有其他1,000个空成员,例如:

a.hasOwnProperty['999']; // false

数组只是具有特殊的自调整长度属性的对象,而且一些通用的方法可以应用于任何合适的对象。

稀疏数组的一个特性(即 0 length 的数字属性不连续)是for循环将遍历每个值,包括缺少的。通过使用for..in循环和使用hasOwnProperty测试,就像对象一样,可以避免这种情况并显着提高性能。

但是如果你不打算使用数组的任何特殊功能,你也可以按照jfriend00的建议使用一个对象。