I need to store information similar to this:

tag_array['design1']['0'][0]['x'] = 100;
tag_array['design1']['0'][0]['y'] = 100;
tag_array['design1']['0'][0]['w'] = 710;
tag_array['design1']['0'][0]['h'] = 332;

This would work if it is PHP but it's not working in javascript.

How do I create the same array in proper javascript syntax?

share|improve this question
Refer this Post stackoverflow.com/questions/966225/… – Muthukumar Sep 5 '12 at 18:22
1  
well you would be better off with objects than arrays since you are using strings. – epascarello Sep 5 '12 at 18:23

2 Answers

In PHP, you can do that because it will make the parent elements too (it actually throws a warning). In JavaScript, it will error out because the parent elements don't exist.

Instead of making it like that, try to make it all at once like this:

var tag_array = {
    design1: {
        '0': [{
            x: 100,
            y: 100,
            w: 710,
            h: 332
        }]
    }
};

This should give you the structure you want.

UPDATE: Answer has been updated to reflect the fact that the 1st 0 can be a string.

share|improve this answer
1  
but it is a string "0" not an integer. – epascarello Sep 5 '12 at 18:25
1  
String versions of numeric properties can be used with numerically-indexed array elements, @epascarello, but you're right it's not clear which setup the OP wants. – Pointy Sep 5 '12 at 18:29
OP here. Yes, the first "0" is a string. Can be replaced with any other strings. – komirad Sep 5 '12 at 18:43
In javascript, when you access a property it is accessed as a string. Since arrays are just fancy objects, they behave the same way. a[0] and a["0"] do the same thing because in the first case the number 0 is converted to a string before looking up the property. – benekastah Sep 5 '12 at 18:45
1  
@komirad: I've updated the answer, how's that? :-) – Rocket Hazmat Sep 5 '12 at 18:50
show 2 more comments

If you want to do it programatically then because JavaScript requires you to have this type of structure

tag_array = {};
tag_array['design1'] = {};
tag_array['design1']['0'] = [];
tag_array['design1']['0'][0] = {};
tag_array['design1']['0'][0]['x'] = 100;

you can make a prototype function to create the object/array structure for you

Object.defineProperty(Object.prototype, 'addDimensions', { value: function(){
    var prop = arguments[0];
    if(this[prop] !== undefined){
        if(typeof this[prop] !== 'object') throw 'Property "'+prop+'" is already defined.'
    }else{
        if(arguments.length > 1 && ~~arguments[1] === arguments[1] && arguments[1] >= 0) this[prop] = [];
        else this[prop] = {};
    }
    if(arguments.length > 1){
        this[arguments[0]].addDimensions.apply(
            this[arguments[0]],
            Array.prototype.slice.call(arguments,1)
        );
    }
    return this;
},
enumerable: false });

and call it on an empty object {}

var myArrayLikeObject = ({}).addDimensions('design1','0',0); // {design1: [ [ {} ] ] }

or an array [] (only if first arg is an integer)

var myMultiArray = [].addDimensions(0,'hi',0); // [ {hi: [ {} ] } ]

or on an existing array or object

var a = [0,1,2];
a.addDimensions(3,0); // a = [0, 1, 2, [ {} ] ]
share|improve this answer
You'll need to modify it a little to check for existing sub-arrays / objects if you want to call it multiple times on the same indices – Paul S. Sep 5 '12 at 18:58
-1: a) Never add enumerable properties to Object.prototype, b) use objects ({}) for non-numeric properties, not arrays – Bergi Sep 5 '12 at 19:00
@Bergi, does the edit I just made solve the issues you had with it? – Paul S. Sep 5 '12 at 19:49
Yes, thanks. Nice recursive function :-) – Bergi Sep 5 '12 at 21:31

Your Answer

 
or
required, but never shown
discard

By posting your answer, you agree to the privacy policy and terms of service.

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