2010-04-26 6 views
1

Je dois pouvoir stocker des objets en javascript, et y accéder très rapidement. Par exemple, j'ai une liste de véhicules, défini comme ceci:Comment stocker des objets complexes en 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 } 

Il y aura potentiellement des centaines de ces entrées de véhicules, qui pourraient être accessibles des milliers de fois. Je dois pouvoir y accéder le plus rapidement possible, idéalement d'une manière utile. Par exemple, je pourrais stocker les objets dans un tableau. Ensuite, je pourrais simplement dire vehicles[0] pour obtenir l'entrée Ford Focus, vehicles[1] pour obtenir l'entrée Suzuki Swift, etc. Cependant, comment puis-je savoir quelle entrée est la Ford Focus? Je veux simplement demander «trouvez-moi la Ford Focus de Jim» et faites-moi parvenir l'objet le plus rapidement possible. Par exemple, dans une autre langue, je pourrais utiliser une table de hachage, indexée par son nom. Comment puis-je faire cela en javascript? Ou, y a-t-il un meilleur moyen?

Merci.

Répondre

4

objets Javascript peuvent être utilisés comme tables de hachage:

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

Comme Rabbott a dit, les objets JSON peuvent être utilisés comme des hachages.

Essayez quelque chose comme ceci pour stocker vos données:

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"]); 

Ceci est en fait à peu près la même représentation que SLaks suggéré, mais le « nom » seront simplement stockées sous la forme d'une clé et non dupliqués dans la valeur.

En note, je crois qu'il est plus approprié de représenter les clés comme des chaînes que j'ai fait ci-dessus ("isDamaged" au lieu de isDamaged).

1

Une autre manière intéressante d'aborder cela est de construire une fonction d'indexation générique. Cette fonction accepte un tableau d'objets et un nom de champ clé. Il stockera chacun des enregistrements dans un tableau stocké dans un objet saisi sur le nom du champ clé transmis.

Code suit:

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); 
    } 
} 
Questions connexes