我需要将特定数字映射到字符串值。这些数字不一定是连续的,所以例如我可能有这样的东西:
var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";
如果我正在做这样的搜索,使用对象或数组obj[126]
会更快吗?{}
[]
我需要将特定数字映射到字符串值。这些数字不一定是连续的,所以例如我可能有这样的东西:
var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";
如果我正在做这样的搜索,使用对象或数组obj[126]
会更快吗?{}
[]
不会有任何区别。ECMAScript 数组,如果稀疏(即没有设置连续索引)被实现为哈希表。在任何情况下,您都可以保证 O(n) 访问时间,所以这根本不应该关心您。
JS-array 是一个对象,所以你选择什么并不重要。
创建了一个 jsperf 测试(http://jsperf.com/array-is-object)来证明这一点。
明确地,一个对象应该是最好的选择。
如果你有这样的代码:
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
。