4

I serially collect information from forms into arrays like so:

list = {"name" : "John", "email" : "name@domain.com", "country" : "Canada", "color" : "blue"};  
identifier = "first_round";

list = {"name" : "Harry", "email" : "othername@domain.com", "country" : "Germany"};  
identifier = "second_round";

I want to combine them into something (I may have braces where I need brackets) like:

list_all = {  
"first_round" :  
 {"name" : "John", "email" : "name@domain.com", "country" : "Canada", "color" : "blue"} ,  
"second_round" :  
{"name" : "Harry", "email" : "othername@domain.com", "country" : "Germany"}  
 };

so I can access them like:

alert(list_all.first_round.name) -> John

(Note: the name-values ("name", "email", "color") in the two list-arrays are not quite the same, the number of items in each list-array is limited but not known in advance; I need to serially add only one array to the previous structure each round and there may be any number of rounds, i.e. "third-round" : {...}, "fourth-round" : {...} and so on.)

Ultimately, I'd like it to be well-parsed for JSON.

I use the jquery library, if that helps.

Nat
  • 61
  • 4
  • On a sidenote, if you're enumerating the properties of list_all as in `for(var key in list_all)`, the order of properties is not guaranteed. You may get "second_round" before "first_round" even though "first_round" was defined first. Use an array instead if you want the order to be preserved. See - http://stackoverflow.com/questions/648139/is-the-order-of-fields-in-a-javascript-object-predicatble-when-looping-through-th – Anurag May 22 '10 at 03:31
  • But when is the order of properties on an object important any way? If order is of importance, then Array is the type to use. – Sean Kinsey May 22 '10 at 12:33
  • @Sean - When you want direct access to elements with a key, but at the same time also want to iterate through all elements in order. It's not absurd to think that someone might want it - Ruby changed the implementation of Hash in 1.9 to guarantee order because someone wanted it. – Anurag May 24 '10 at 19:20
  • Only problem is that the ES262-3 spec states that it is implementation dependent whether the iteration is in order or not - you simply cannot rely on this - and so you shouldn't. And I still fail to see the reason why anyone would *need* to have the order persisted. – Sean Kinsey May 24 '10 at 19:25
  • I am actually saying the exact same thing - *that you shouldn't rely on the order in which properties will be enumerated*. As for the second point, why would someone want direct access to contained objects with a key as well as ordered access to all elements, there are many examples. For a macroscopic view, consider this - there are an infinite number of lists where order is important, but at the same time each item in the list has some unique property based on which it can be immediately and unambiguously identified. To represent such structures, we need the order to be persisted. – Anurag May 24 '10 at 21:01
  • @Sean, These are just a few examples: A list of countries ordered alphabetically, but also accessible in `O(1)` using the ISO-3166 country code as a key, or perhaps the list of questions tagged "JavaScript" on SO in chronological order that can also be accessed using the unique question id as a key. – Anurag May 24 '10 at 21:08

2 Answers2

1

Create list_all as a new object as follows:

var list_all = {};
list_all[identifier_1] = list_1;
list_all[identifier_2] = list_2;
// ...
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • +1 - Perhaps worth noting that for valid json (as OP seems to want), json2 library can be used. `JSON.stringify(list_all)` http://www.json.org/json2.js – user113716 May 22 '10 at 02:45
  • All the hours I spent on this--somehow I missed this one: worked perfectly, thanks! – Nat May 22 '10 at 15:44
0

JSON uses object literal notation. The form:

var person = {
 "name": "Douglas Adams"
 "age": 42
};

Is exactly the same (for all intents and purposes) as:

var person = new Object();
person.name = "Douglas Adams";
person.age = 42;

Does that help you?

You can also use

person["age"]

this is the same as

person.age

and to iterate through named properties:

//prints the person.propertyName for all propertyName in person
for (var propertyName in person) {
 alert(person[propertyName]);
}

You can transmit data as a string, using it to interact with the server and converting it into an object, using jQuery. Ex:

var jsonString = "{'name': 'Douglas Adams', 'age': 42}";
jQuery.parseJson(jsonString); //returns this as an object

Search for JSON in the jQuery API docs: http://api.jquery.com/

RMorrisey
  • 7,637
  • 9
  • 53
  • 71