0

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

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

如果我正在做这样的搜索,使用对象或数组obj[126]会更快吗?{}[]

4

4 回答 4

2

不会有任何区别。ECMAScript 数组,如果稀疏(即没有设置连续索引)被实现为哈希表。在任何情况下,您都可以保证 O(n) 访问时间,所以这根本不应该关心您。

于 2012-09-26T20:34:19.670 回答
2

我创建了一个微基准为您服务 - 查看@Bergi 提供的更全面的测试。在我的浏览器上,对象文字有点慢,但并不显着。自己试试。

于 2012-09-26T20:33:41.283 回答
0

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

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

于 2012-09-26T20:33:52.953 回答
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
    }
}

​基准测试 ​</p>

总共:

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

于 2012-09-26T20:30:05.110 回答