12

I have an array of objects that contain other objects. At the moment the way I declare them is pretty long winded. Is there are more condense way to do the following:

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

Is there a way to declare this setup that isn't so verbose, something similair to how an xml would be layed out, something like:

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

I can't figure out how to nest array declarations without having to constantly repeat the variable names.

3 Answers 3

18

Use object and array literals:

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

Or something that reflects your original code more directly:

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

Note: In javascript, var foo = [] is exactly equivalent to (and the preferred way to write) var foo = new Array(). Also, var foo = {} is the same as var foo = new Object().

Note: Don't forget to add commas between separate sub-objects.

Sign up to request clarification or add additional context in comments.

3 Comments

How do I copy the contents of this array into another independent array. When I do, New_Countries[1] = Countries[0], I guess the object reference is being copied and both point to the same object. Thanks.
@Themasterhimself: For deep copy you need to do it recursively yourself. Write functions to iterate through arrays and objects and have them recursively call each other until you hit either a number or a string. Use for(var x in y) for objects and for (var x=0;x<y.length;x++) for arrays.
@Themasterhimself: Some libraries may already implement deep copy methods/functions. It may be worth looking up jQuery or underscore. But it's not really hard to write one yourself.
4

Would this be good enough for you?

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

Comments

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

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.