2010-04-26 30 views
1

我需要能夠在JavaScript中存儲對象,並快速訪問它們。例如,我有一個車輛列表,如下定義:如何在JavaScript中存儲複雜對象?

{ "name": "Jim's Ford Focus", "color": "white", isDamaged: true, wheels: 4 } 
{ "name": "Bob's Suzuki Swift", "color": "green", isDamaged: false, wheels: 4 } 
{ "name": "Alex's Harley Davidson", "color": "black", isDamaged: false, wheels: 2 } 

這些車輛條目可能會有數百個,可能會被訪問​​數千次。我需要能夠儘可能快地訪問它們,理想情況下以一些有用的方式訪問它們。

例如,我可以將對象存儲在一個數組中。然後,我可以簡單地說vehicles[0]可以獲得福特福克斯的參賽作品,vehicles[1]可以獲得鈴木雨燕的參賽作品等。但是,我怎麼知道福特福克斯是哪個作品呢?

我想簡單地問「找到我吉姆的福特福克斯」,然後讓對象儘快回到我身邊。例如,在另一種語言中,我可能會使用按名稱索引的哈希表。我怎麼能在JavaScript中做到這一點?或者,還有更好的方法?

謝謝。

回答

4

JavaScript對象可以作爲哈希表:

var nameIndex = {}; 

for (var i = 0; i < cars.length; i++) 
    nameIndex[cars[i].name] = cars[i]; 

//Later: 
var someName = "Jim's Ford Focus"; 
var car = nameIndex[someName]; 
3

由於Rabbott說,JSON對象可以像散列一樣使用。

嘗試這樣的事情來存儲你的數據:

vehicles = { 
    "Jim's Ford Focus": { "color": "white", "isDamaged": true, "wheels": 4 }, 
    "Bob's Suzuki Swift": { "color": "green", "isDamaged": false, "wheels": 4 }, 
    "Alex's Harley Davidson": { "color": "black", "isDamaged": false, "wheels": 2 } 
}; 
document.write(vehicles["Jim's Ford Focus"]["color"]); 

這實際上是幾乎一樣SLaks建議,但「姓名」將簡單地存儲爲鍵和值內不重複相同的表示。

作爲一個說明,我認爲這是更正確的代表作爲字符串,如上所述("isDamaged",而不是isDamaged)作爲字符串。

1

解決這個問題的另一個有趣的方法是構建一個通用索引函數。該函數將接受一個對象數組和一個鍵字段名稱。它會將每個記錄存儲在一個存儲在傳入的鍵字段名稱中的鍵入的對象中的數組中。

代碼如下:

var cars = [ 
    { "name": "Jim's Ford Focus",  "color": "white", "isDamaged": true, "wheels": 4 }, 
    { "name": "Bob's Suzuki Swift",  "color": "green", "isDamaged": false, "wheels": 4 }, 
    { "name": "Alex's Harley Davidson", "color": "black", "isDamaged": false, "wheels": 2 } 
]; 

function buildIndex(items, key) { 
    var index = {}, 
     idx, 
     item; 
    for (idx in items) { 
    item = items[idx]; 
    if(index[items[idx][key]] === undefined) { 
     index[items[idx][key]] = [item]; 
    } else { 
     index[items[idx][key]].push(item); 
    } 
    } 
    return index; 
} 

var indexedByWheels = buildIndex(cars, "wheels"); 

/* 

indexedByWheels will be structured as: 

{ 
    "4": [ 
    { "name": "Jim's Ford Focus",  "color": "white", "isDamaged": true, "wheels": 4 }, 
    { "name": "Bob's Suzuki Swift",  "color": "green", "isDamaged": false, "wheels": 4 } 
    ], 
    "2": [ 
    { "name": "Alex's Harley Davidson", "color": "black", "isDamaged": false, "wheels": 2 } 
    ] 
]; 

*/ 

for (var v in indexedByWheels) { 
    print("Wheels " + v) ; 
    for (var i in indexedByWheels[v]) { 
    print(" Car: " + indexedByWheels[v][i].name); 
    } 
}