tags:

views:

703

answers:

5

Hi

I have problem concatenating two associative arrays in javascript. below the sample code

var firstArray =  new Array();
firstArray.c1 = "sam";  
firstArray.c2 = "kam";
var secArray =  new Array();
secArray.c3 = "sam";    
secArray.c4 = "kam";
var res = firstArray.concat(secArray);

is this a known limitation??

whats the best way to achive this one..

Cheers

Ramesh Vel

+2  A: 

Try this,

var firstArray = new Array("sam","kam");
var secArray = new Array("sam","kam");
var res = firstArray.concat(secArray);
kayteen
+10  A: 

You are not using Array functionality - just Object functionality. In JavaScript, Object is an associative array - you use Array for arrays indexed by integers. If you did

var firstArray =  new Array();
firstArray.push("sam");  
firstArray.push("kam");
var secArray =  new Array();
secArray.push("sam");    
secArray.push("kam");
var res = firstArray.concat(secArray);

then concat would work as expected. To merge associative arrays, do:

for (attr in src_array) { dest_array[attr] = src_array[attr]; }

This will of course overwrite existing keys in dest_array which have counterparts in src_array.

Vinay Sajip
thanks for the reply.. this is wat i expected...
Ramesh Vel
+1  A: 

JavaScript doesn't have associative arrays, it has object hashes. You're creating an array and assigning values to some of it's properties, not in the array itself.

Your concat will not work because the values are object properties. To do a concat the way you have it you'll need to combine the two objects. YUI, jQuery, and the other JavaScript frameworks provide helpful methods to do just that.

Doomspork
+1  A: 

Strictly speaking those aren't associative arrays at all: they are arrays of zero length, with additional named properties. Assigning those properties works because arrays are also objects in JavaScript; but that doesn't make them an associative array. It's better to look on them as hashes.

Array methods such as concat will only work with the numerically-indexed elements of arrays, not with the properties of objects - even if those objects happen to be arrays.

NickFitz
+1  A: 

Arrays in JavaScript have only numerical keys. Only objects can have non numerical properties. So try this instead:

var firstArray = {};
firstArray.c1 = "sam";
firstArray.c2 = "kam";
var secArray =  {};
secArray.c3 = "sam";  
secArray.c4 = "kam";

for (var prop in secArray) {
    if (secArray.hasOwnProperty(prop)) {
        firstArray[prop] = secArray[prop];
    }
}
Gumbo
Why the redundancy? You're looping over the properties in the second array and then calling "hasOwnProperty" on the second array with the value from the first loop. Did you mean to test "hasOwnProperty" on the first array?
Doomspork