2

I have the following JavaScript code:

oCoord = {x: null, y: null};
var aStack = [];

oCoord.x = 726;
oCoord.y = 52;
aStack.push(oCoord);

oCoord.x = 76;
oCoord.y = 532;
aStack.push(oCoord);

oCoord.x = 716;
oCoord.y = 529;
aStack.push(oCoord);

Now this creates the following structure (an array of three objects).

Array[Object, Object, Object];

However, when I try and access the properties of each object they are all coming out the same. Why is this?

alert(aStack[0].x); // Outputs 716
alert(aStack[1].x); // Outputs 716
alert(aStack[2].x); // Outputs 716

What am I doing wrong?

5 Answers 5

12

You are using the same oCoord for all your coordinates objects.

Try this instead:

var aStack = []; 
aStack.push( { x: 726, y: 52} );
aStack.push( { x: 532, y: 76} ); 
aStack.push( { x: 716, y: 529} );
Sign up to request clarification or add additional context in comments.

1 Comment

thanks, perfect. Correct answer given for first full correct explanation
3

You are using the same reference to your object. You need to create a new one each time.

E.g.

var aStack = []; 

aStack.push( { x: 2, y: 23 }); 
aStack.push( { x: 3, y: 4 }); 
aStack.push( { x: 33, y: 2 });

Or, if you prefer the style you wrote it in, do:

var aStack = []; 

var o = {};
o.x=1;
o.y=3;
aStack.push(o); 

var o = {};
o.x=21;
o.y=32;
aStack.push(o); 

var o = {};
o.x=14;
o.y=43;
aStack.push(o); 


alert( aStack[0].x ); 
alert( aStack[1].x ); 
alert( aStack[2].x );

Note we are re-declaring with var each time to create a new instance.

2 Comments

Afaik you can't "re-declare" variables in JS, the var part will just be ignored and this answer would work without the extra vars (i.e. o = {} only).
cic is right, you aren't declaring a new variable each time, instead you are using the same variable o everywhere, but assigning new valus to it.
1
var aStack = [];
aStack.push({ x: 726; y: 52 });
aStack.push({ x: 76; y: 532 });
aStack.push({ x: 716; y: 529 });

Comments

1

Egil Hansen's answer is probably better, but you could clone the object as an alternative solution:

// Some function to clone objects (e.g. using jQuery)
function clone(o) { return $.extend(true, {}, o); }

oCoord = { x: null, y: null };
var aStack = []; 

oCoord.x = 726; 
oCoord.y = 52; 
aStack.push( clone(oCoord) ); 

oCoord.x = 76; 
oCoord.y = 532; 
aStack.push( clone(oCoord) ); 

oCoord.x = 716; 
oCoord.y = 529; 
aStack.push( clone(oCoord) );

// console.log(aStack) =>
// [Object x=726 y=52, Object x=76 y=532, Object x=716 y=529]

Comments

1

You are overwriting the values of x and y in oCord.

So when you say

 oCoord.x = 716;
 oCoord.y = 529;

it overwrites the previous value.

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.