vote up 0 vote down
star

Simple, quick, question.

How can I create dynamically create keys in javascript associative arrays? All the doc I've found so far is to update keys that are already created:

 arr['key'] = val;

I have a string like this " name = oscar "

And I want to endup with something like this:

{ name: 'whatever' }

That is I split the string and get the first element, and I want to put that in a dict ( asoc arr ).

EDIT

This is what I have and currently doesn't work ( I guess :S )

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.

EDIT 2

Aaarggg. I hate re-take a programming languages. I forget the most basic things. It turns out I was filling the dict correctly but didn't knew how to display the values :-B . ... . Thank you all

offensive?
add comment

5 Answers:

vote up 1 vote down
check

Use the first example. If the key doesn't exist it will be added.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

Will pop up a message box containing 'oscar'.

Try...

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
link|offensive?
comments (4)
vote up 5 vote down

Somehow all examples, while work well, are overcomplicated:

  • They use new Array(), which is the overkill (and the overhead) for a simple associative array (AKA dictionary).
  • The better ones use new Object(). Works fine, but why all this extra typing?

This question is tagged "beginner", so let's make it simple.

The uber-simple way to use a dictionary in JavaScript or "Why JavaScript doesn't have a special dictionary object?":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for(key in dict){
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if(dict.hasOwnProperty(key){
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replaced it recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if(key != "temp1"){
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
}else{
  // do nothing, we are good ;-)
}
link|offensive?
add comment
vote up 0 vote down

Javascript does not have associative arrays, it has objects.

The following lines of code all do exactly the same thing - set the 'name' field on an object to 'orion'.

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

It looks like you have an associative array because an Array is also an Object - however you're not actually adding things into the array at all, you're setting fields on the object.

Now that that is cleared up, here is a working solution to your example

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.
link|offensive?
comments (2)
vote up 2 vote down

In response to MK_Dev, one is able to iterate, but not consecutively. (For that obviously an array is needed)

Quick google search brings up hash tables in javascript

Example code for looping over values in a hash (from aforementioned link):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}
link|offensive?
add comment
vote up 1 vote down

Just a reminder: you won't be able to iterate through the values when adding them in this manner. Looking at your question I am pretty sure you knew this (since you want it to use it as "{ name: 'whatever' }"), but some people may not be aware of this.

link|offensive?
comments (1)

Your Answer:

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.