2010-08-27 23 views
11

Tengo una matriz de objetos que contienen otros objetos. Por el momento, la forma en que los declaro es bastante larga. Es que hay mucho más condensan para hacer lo siguiente:Declarar una matriz de objetos que contienen objetos

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

¿Existe una forma de declarar esta configuración que no es tan detallado, algo similair a cómo un xml sería organizada, algo así como:

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

No puedo averiguar cómo anidar las declaraciones de matriz sin tener que repetir constantemente los nombres de las variables.

Respuesta

16

el uso de objetos y matrices de literales:

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

o algo que refleja su código original de manera más directa:

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

Nota: En Javascript, var foo = [] es exactamente equivalente a (y la mejor forma de escribir) var foo = new Array(). Además, var foo = {} es lo mismo que var foo = new Object().

Nota: No olvide agregar comas entre subobjetos separados.

+0

Cómo copio el contenido de esta matriz en otra matriz independiente. Cuando lo hago, New_Countries [1] = Countries [0], supongo que la referencia del objeto se está copiando y ambos apuntan al mismo objeto. Gracias. – Themasterhimself

+0

@Themasterhimself: para una copia profunda necesita hacerlo recursivamente usted mismo. Escriba funciones para iterar a través de matrices y objetos y pídales que se llamen recursivamente hasta que toque un número o una cadena. Úselo para (var x in y) para objetos y para (var x = 0; x slebetman

+0

@Themasterhimself: Es posible que algunas bibliotecas ya implementen métodos/funciones de copia profunda. Puede valer la pena buscar jQuery o guión bajo. Pero no es realmente difícil escribir uno tú mismo. – slebetman

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

}

4

¿Sería esto lo suficientemente bueno para usted?

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 } 
       ] 
     } 
    ] 
    } 
] 
Cuestiones relacionadas