我有~16,000个项目(一个项目是数组,有6个值)。所有项目都有5"属性",他们的数字。我需要存储它们,当我知道属性时,尽快返回项目。我尝试了两种方法:
a = attribute1
,b = attribute2
...到e
,那么我可以通过data1[a][b][c][d][e]
获取用户正在查找的项目。以这种格式存储的完整数据:http://jpst.it/z12- myItem = data2[""+a+b+c+d+e]
。 http://jpst.it/z13p 我运行了一些测试,看看哪种方法更快:
var test,
a = 30175,
b = 5,
c = 1,
d = 1,
e = 60,
abcde = 301755360;
console.time("test1");
for (var i = 0; i < 9999999; i++)
test = data1[a][b][c][d][e];
console.timeEnd("test1");
console.time("test2");
for (var i = 0; i < 9999999; i++)
test = data2[abcde];
console.timeEnd("test2");
我的电脑上的结果:
test1 test2
Firefox: 1482.00ms 1341.00ms
Chrome: 665.00ms 424.00ms
Explorer: 12555.17ms 4945,50ms
第二种方法总是更快。但为什么?我跑了另一个测试,知道JS必须检查给定对象的密钥是否等于所需密钥的次数:
var x = 0;
function fn(obj, myKey) {
for (var key in obj) {
x++;
if (key == myKey)
return obj[key];
}
}
方法1:fn(fn(fn(fn(fn(data1, a), b), c), d), e);
=&gt; x
是352
方法2:fn(data2, abcde);
=&gt; x
是3154.
但是,方法2不慢10倍,甚至更快。
答案 0 :(得分:0)
这可能会让您了解正在发生的事情。第二个吸气剂被称为9次,第一个吸气剂被称为45次。每次它首先必须访问30186,然后是6,然后... 5调用每次迭代来获取值。
var x = 0;
var y = 0;
var data1 = {"30186":{"6":{"1":{"1":{"0":[4,1430745862,"3 - 5 ref","4 ref","4 ref",1]}}}}};
var data2 = {"3018663":[4,1430745862,"3 - 5 ref","4 ref","4 ref",1]};
Object.prototype.get = function(i) { x++; console.log(i); return this[i]; }
Object.prototype.get2 = function(i) { y++; return this[i]; }
for (var i = 0; i < 9; i++)
test = data1.get(30186).get(6).get(1).get(1).get(0);
for (var i = 0; i < 9; i++)
test = data2.get2(3018663);
console.log(x, y);