2014-02-19 76 views
2

我有部分数据用分布在不同集合中的ID标记。我可以在JavaScript中获得对象和数组的好处吗?

我需要直接使用ID访问这些数据,但我也需要循环快速的数据。

var listOfPartA = { 
    34523: { foo: 7, bar: 123}, 
    6435: { foo: 2, bar: 163}, 
    3123: { foo: 3, bar: 223}, 
    ... 
}; 

var listOfPartB = { 
    34523: { baz: 1}, 
    6435: { baz: 4}, 
    3123: { baz: 6}, 
    ... 
}; 

如果我需要获得特定dataparts一个标识它的速度快,但如果我尝试循环中的所有dataparts它的速度慢。

var listOfPartA = [ 
    { id: 34523, foo: 7, bar: 123}, 
    { id: 6435, foo: 2, bar: 163}, 
    { id: 3123, foo: 3, bar: 223}, 
    ... 
]; 

var listOfPartB = [ 
    { id: 34523, baz: 1}, 
    { id: 6435, baz: 4}, 
    { id: 3123, baz: 6}, 
    ... 
]; 

如果我要得到具体dataparts这些对象是缓慢的,因为我必须手动搜索它们的ID,但如果我遍历它的快速所有dataparts。

我不能有快速直接访问和快速迭代吗?

+3

你总是可以使用两者。数组通过引用进行分配,因此在内存方面的开销很小。 – meagar

+1

同时使用两个数据。关键字:索引结构;) – Coxer

+0

如果我想将数据删除到所有ID,该怎么办?我可以在对象中快速执行它,但不会导致数组最终导致死亡引用? –

回答

2

预索引你的数组:

var listOfPartA = [ 
    {id:34523, foo:7 bar:123}, 
    ... 
]; 

var lookupPartA = {}; 
listOfPartA.forEach(function(x,i) {lookupPartA[x.id] = i;}); 

现在,你可以用listOfPartA阵列循环快,但也很快发现:

listOfPartA[lookupPartA[34523]] 
+1

它不一定是'[x.id]' - 除了做得好的hashindex :) – Coxer

1

预索引你的对象:

var lookupPartA = { 
    34523: { foo: 7, bar: 123}, 
    ... 
}; 

var listOfIds = Object.keys(lookupPartA); 

现在,你可以在lookupPartA对象很快找到ID,但也环快速:

for (var i=0, l=listOfIds.length; i<l; i++) 
    lookupPartA[listOfIds[i]] 
+0

这是一个测试,其中object.keys没有太多好处:http://jsperf.com/performance-of-array-vs-object/17 –

+1

@K ..:注意,你没有每次循环数组时都要执行'Object.keys',只有当你插入/删除键时。不过,令人惊讶的是它比'for in'循环更快:-) – Bergi

+0

啊,你的意思是,测试中的性能损失来自'Object.keys'? –

相关问题