对于这种特殊情况,哪种javascript结构的访问时间更快?

时间:2012-09-26 20:27:16

标签: javascript arrays performance object data-structures

我需要将特定数字映射到字符串值。这些数字不一定是连续的,所以例如我可能有这样的东西:

var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";

如果我正在进行此类obj[126]搜索,那么使用对象{}或数组[]会更快吗?

4 个答案:

答案 0 :(得分:2)

我为你创建了一个 microbenchmark - 通过@Bergi查看more comprehensive test。在我的浏览器上,对象文字有点慢,但不是很明显。亲自尝试一下。

答案 1 :(得分:2)

没有区别。 ECMAScript数组,如果稀疏(没有设置连续索引)则实现为哈希表。在任何情况下,您都可以获得O(n)访问时间,因此这根本不会引起您的关注。

答案 2 :(得分:0)

定义一个对象应该是最好的选择。

如果你有这样的代码:

var arr = [];
arr[10] = 'my value';

,您的数组变为11个值的数组

alert(arr.length); // will show you 11

,前10位是undefined

显然,您不需要长度为1000的数组来存储

var arr = [];
arr[999] = 'the string';

此外,我必须注意到,在编程​​中,您必须为特定情况选择合适的类 你的任务是制作key: value对的地图,对象是更好的选择。
如果您的任务是制作有序集合,那么确定您需要一个数组。

<强>更新

在评论中回答你的问题。

想象一下,你有两个“集合” - 一个数组和一个对象。每个键只有一个键/索引等于999。

如果您需要查找值,则需要遍历集合。

对于数组,你将有999次迭代 对于对象 - 只有一次迭代。

http://jsfiddle.net/f0t0n/PPnKL/

var arrayCollection = [],
    objectCollection = {};

arrayCollection[999] = 1;
objectCollection[999] = 1;
var i = 0,
    l = arrayCollection.length;

for(; i < l; i++) {
    if(arrayCollection[i] == 1) {
        alert('Count of iterations for array: ' + i); // displays 999
    }
}

i  = 0;

for(var prop in objectCollection) {
    i++;
    if(objectCollection[prop] == 1) {
        alert('Count of iterations for object: ' + i); // displays 1
    }
}

Benchmark

总计:

您必须正确设计应用程序并考虑将来可能需要对您的收藏进行一些不同操作的任务 如果您需要订购您的收藏品,则必须选择array 否则,object可能是更好的选择,因为访问其属性的速度与访问数组项的速度大致相同,但object中的值搜索将比稀疏{{}中的值更快。 1}}。

答案 3 :(得分:0)

JS-array是一个对象,所以你选择什么并不重要。

创建了一个jsperf测试(http://jsperf.com/array-is-object)来证明这一点。