Search code examples
javascriptmultidimensional-arrayassociative-array

Multi-dimensional associative arrays in JavaScript


There is the following query results: (key1 and key2 could be any text)

id   key1     key2     value

1    fred     apple    2
2    mary     orange   10
3    fred     banana   7
4    fred     orange   4
5    sarah    melon    5
...

and I wish to store the data in a grid (maybe as an array) looping all the records like this:

         apple    orange   banana  melon
fred        2        4         7     -
mary        -        10        -     -
sarah       -        -         -     5

In PHP this would be really easy, using associative arrays:

$result['fred']['apple'] = 2;

But in JavaScript associative arrays like this doesn't work. After reading tons of tutorial, all I could get was this:

arr=[];
arr[1]['apple'] = 2;

but arr['fred']['apple'] = 2; doesn't work. I tried arrays of objects, but objects properties can't be free text. The more I was reading tutorials, the more I got confused...

Any idea is welcome :)


Solution

  • Just use a regular JavaScript object, which would 'read' the same way as your associative arrays. You have to remember to initialize them first as well.

    var obj = {};
    
    obj['fred'] = {};
    if('fred' in obj ){ } // can check for the presence of 'fred'
    if(obj.fred) { } // also checks for presence of 'fred'
    if(obj['fred']) { } // also checks for presence of 'fred'
    
    // The following statements would all work
    obj['fred']['apples'] = 1;
    obj.fred.apples = 1;
    obj['fred'].apples = 1;
    
    // or build or initialize the structure outright
    var obj = { fred: { apples: 1, oranges: 2 }, alice: { lemons: 1 } };
    

    If you're looking over values, you might have something that looks like this:

    var people = ['fred', 'alice'];
    var fruit = ['apples', 'lemons'];
    
    var grid = {};
    for(var i = 0; i < people.length; i++){
        var name = people[i];
        if(name in grid == false){
            grid[name] = {}; // must initialize the sub-object, otherwise will get 'undefined' errors
        }
    
        for(var j = 0; j < fruit.length; j++){
            var fruitName = fruit[j];
            grid[name][fruitName] = 0;
        }
    }