2010-08-27 17 views
11

Ho una matrice di oggetti che contengono altri oggetti. Al momento il modo in cui li dichiaro è piuttosto lungo. È che ci sono molto più di condensa per effettuare le seguenti operazioni:Dichiarare una serie di oggetti contenenti oggetti

function city(name,population) 
{ 
this.name = name; 
this.population = population; 
} 

function state(name) 
{ 
this.name= name; 
this.cities = new Array(); 
} 

function country(name) 
{ 
this.name= name; 
this.states = new Array(); 
} 

Countries = new Array(); 
Countries[0] = new Country("USA"); 
Countries[0].states[0] = new State("NH"); 
Countries[0].states[0].cities[0] = new city("Concord",12345); 
Countries[0].states[0].cities[1] = new city("Foo", 456); 
... 
Countries[3].states[6].cities[35] = new city("blah", 345); 

C'è un modo per dichiarare questa configurazione che non è così verbose, qualcosa similair a come un XML sarebbe spiegate, qualcosa di simile:

data = 
usa 
    NH 
    concord: 34253 
    foo: 3423 
    blah: 99523 
    NC 
    place: 23522 
Uk 
    foo 
    bar: 35929 
    yah: 3452 

Non riesco a capire come annidare le dichiarazioni di array senza dover ripetere costantemente i nomi delle variabili.

risposta

16

utilizzare l'oggetto e di array letterali:

var data = { 
    usa : { 
     NH : { 
      concord: 34253, 
      foo: 3423, 
      blah: 99523 
     }, 
     NC : { 
      place: 23522 
     } 
    }, 
    uk : { 
     foo : { 
     bar: 35929, 
     yah: 3452 
     } 
    } 
} 

o qualcosa che riflette il vostro codice originale in modo più diretto:

var Countries = [ 
    { 
     name : 'USA', 
     states : [ 
      { 
       name : 'NH', 
       cities : [ 
        { 
         name : 'Concord', 
         population : 12345 
        }, 
        { 
         name : "Foo", 
         population : 456 
        } 
        /* etc .. */ 
       ] 
      } 
     ] 
    }, 
    { 
     name : 'UK', 
     states : [ /* etc... */ ] 
    } 
] 

Nota: in JavaScript, var foo = [] è esattamente equivalente a (e il modo preferito per scrivere) var foo = new Array(). Inoltre, var foo = {} corrisponde a var foo = new Object().

Nota: non dimenticare di aggiungere virgole tra oggetti secondari separati.

+0

Come si copia il contenuto di questo array in un altro array indipendente. Quando lo faccio, New_Countries [1] = Paesi [0], suppongo che il riferimento all'oggetto sia stato copiato e puntino entrambi allo stesso oggetto. Grazie. – Themasterhimself

+0

@Themasterhimself: per la copia profonda è necessario farlo in modo ricorsivo. Scrivi le funzioni per iterare attraverso matrici e oggetti e farli chiamare in modo ricorsivo fino a quando non si preme un numero o una stringa. Utilizzare per (var x in y) per gli oggetti e per (var x = 0; x slebetman

+0

@Themasterhimself: alcune librerie potrebbero già implementare metodi/funzioni di copia profonda. Potrebbe valere la pena cercare jQuery o underscore. Ma non è molto difficile scriverne uno da solo. – slebetman

3
data = { 
usa: { 
    NH: { 
    concord: 34253, 
    foo: 3423, 
    blah: 99845 
    } 
uk: { 
    foo: { 
    bar: 3454, 
    yah: 33457 
    } 
    } 
} 

}

4

Questo sarebbe abbastanza buono per voi?

var data = [ 
    { name: "USA", 
    states: [ 
     { name: "NH", 
     cities: [ 
      { name: "concord", population: 34253 }, 
      { name: "foo", population: 3423 }, 
      { name: "blah", population: 99523 } 
     ] 
     }, 
     { name: "NC", 
     cities: [ 
      { name: "place", population: 23522 } 
     ] 
     } 
    ] 
    }, 
    { 
    name: "UK", 
    states: [ 
     { name: "foo", 
     cities: [ 
        { name: "bar", population: 35929 }, 
        { name: "yah", population: 3452 } 
       ] 
     } 
    ] 
    } 
] 
Problemi correlati