87 votes

Tableaux associatifs multidimensionnels en javascript

Les résultats de la requête sont les suivants : (key1 et key2 peuvent être n'importe quel texte)

id   key1     key2     value

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

et je souhaite stocker les données dans une grille (peut-être sous forme de tableau) en boucle tous les dossiers comme ça :

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

En PHP, cela serait très facile, en utilisant des tableaux associatifs :

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

Mais en javascript, les tableaux associatifs comme celui-ci ne fonctionnent pas. Après avoir lu des tonnes de tutoriels, tout ce que j'ai pu obtenir est ceci :

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

mais arr['fred']['apple'] = 2; ne fonctionne pas. J'ai essayé les tableaux d'objets, mais les propriétés des objets ne peuvent pas être du texte libre. Plus je lisais des tutoriels, plus je m'embrouillais...

Toute idée est la bienvenue :)

162voto

Matt Points 15107

Il suffit d'utiliser un objet JavaScript ordinaire, qui sera "lu" de la même manière que vos tableaux associatifs. Vous devez également vous rappeler de les initialiser d'abord.

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 } };

Si vous regardez les valeurs, vous pouvez avoir quelque chose qui ressemble à ça :

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;
    }
}

28voto

charliegriefer Points 2588

Si ce n'est pas le cas ont pour être un tableau, vous pouvez créer un objet JS "multidimensionnel"...

<script type="text/javascript">
var myObj = { 
    fred: { apples: 2, oranges: 4, bananas: 7, melons: 0 }, 
    mary: { apples: 0, oranges: 10, bananas: 0, melons: 0 }, 
    sarah: { apples: 0, oranges: 0, bananas: 0, melons: 5 } 
}

document.write( myObject[ 'fred' ][ 'apples' ] );
</script>

13voto

cambraca Points 7736

Javascript est flexible :

var arr = {
  "fred": {"apple": 2, "orange": 4},
  "mary": {}
  //etc, etc
};

alert(arr.fred.orange);
alert(arr["fred"]["orange"]);
for (key in arr.fred)
    alert(key + ": " + arr.fred[key]);

9voto

Michał Wereda Points 183

Comme j'avais besoin d'obtenir tous les éléments d'une manière agréable j'ai rencontré ce sujet SO. Traverser un tableau/objet associatif à 2 dimensions - peu importe le nom pour moi, car la fonctionnalité compte.

    var imgs_pl= {'offer':{'img':'wer-handwritter_03.png','left': 1,'top': 2 },
    'portfolio':{'img':'wer-handwritter_10.png','left': 1,'top': 2 },
    'special':{'img':'wer-handwritter_15.png','left': 1,'top': 2 }
    };
    for (key in imgs_pl){
        console.log(key);
        for (subkey in imgs_pl[key]){
            console.log(imgs_pl[key][subkey]);
        }//for

    }//for

3voto

Tim Points 2704

N'utilisez pas un tableau, mais un objet.

      var foo = new Object();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X