2012-04-02 61 views
3

我有這兩個數據結構,我不斷地發現自己從數據庫中提取數據時之間進行選擇:數據結構有關最佳做法的獨特的ID

{ 
    "1": {"location": "seattle", "color": "red"}, 
    "2": {"location": "irvine", "color": "blue"}, 
    "3": {"location": "san diego", "color": "green"} 
} 

{ 
    "listings":[ 
     {"id": "1", "location": "seattle", "color": "red"}, 
     {"id": "2", "location": "irvine", "color": "blue"}, 
     {"id": "3", "location": "san diego", "color": "green"} 
    ] 
} 

每個似乎有利弊...

對象結構非常適合用於通過說obj['3'].color快速訪問給定值的值,當列出所有對象時,您必須循環使用看起來非常緩慢的for(key in obj)循環。

使用for(var i=0; i<array.length; i++)時,陣列結構循環得更快,但是訪問賦予id的值並不容易。你必須建立一個函數,循環遍歷整個數組,檢查id與提供的參數。

這是兩種解決方案的jsperf

你認爲哪個更好?爲什麼?

+2

您有一個JavaScript對象和數組,但沒有JSON。如果您將數據作爲JSON傳輸到客戶端,那很好,但是一旦數據被解析,您就不再處理JSON了。 – 2012-04-02 11:11:53

+0

這是一回事。假設服務器返回解析爲JSON的對象或解析爲JSON的數組。 – alnafie 2012-04-02 11:13:55

+0

不是。 JSON是一種數據交換格式,而JavaScript數組或對象是JavaScript中的數據類型。不要被類似的語法誤導。如果你的問題是要弄清楚什麼是你的目的最好的數據結構,那麼它根本與JSON無關。 – 2012-04-02 11:17:14

回答

1

一如既往,答案是:這取決於。你會主要通過id隨機訪問這些對象嗎?然後使用該對象。你會主要通過他們循環,以便?然後使用數組。

當然,你可以通過返回一個數組,然後通過id值創建一個索引。例如,

var arr = /*...wherever you get your second example, the array...*/; 
var index, len, entry; 
arr.index = {}; 
for (index = 0, len = arr.length; index < len; ++index) { 
    entry = arr[index]; 
    arr.index[entry.id] = entry; 
} 

(我有這樣做,因爲我定期覺得這是一個很有用的技術功能。)

現在你可以遍歷他們一個循環,隨機或通過arr.index["some_id"]訪問它們。請注意,修改它時必須小心(例如,確保在兩個位置都進行了刪除和添加)。

注意,這裏我使用的實際陣列上的屬性,稱爲index(該名稱可以是任何你喜歡的,我經常使用indexbyId或類似)。有些人不喜歡在數組上使用非索引屬性;我沒有問題,因爲陣列are really just objects anyway。但是,您不必,可以跟蹤自己的變量中的索引作爲arr的同位體。

還要注意的是,雖然有可能在迭代的陣列上的對象與for使用for..in速度的絕對,有正對迭代的那個速度任何真實世界的衝擊的機率非常低。

+0

您能否詳細說明「返回一個數組,然後通過id值在其上創建一個索引」? – alnafie 2012-04-02 11:18:00

+0

@alnafie:完成。 – 2012-04-02 11:19:45