2014-02-19 116 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'? –

相關問題