2010-04-26 55 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); 
    } 
}