Création dynamique de clés dans un tableau associatif JavaScript

Comment puis-je créer dynamiquement des clés dans des tableaux associatifs javascript?

Toute la documentation que j'ai trouvée jusqu'à présent consiste à mettre à jour les clés déjà créées:

 arr['key'] = val;

J'ai une chaîne comme celle-ci " name = oscar "

Et je veux finir avec quelque chose comme ceci:

{ name: 'whatever' }

C'est-à-dire que je divise la chaîne et obtiens le premier élément, et je veux le mettre dans un dictionnaire.

Code

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // prints nothing.
184
demandé sur George Stocker 2008-12-09 04:13:34

9 réponses

Utilisez le premier exemple. Si la clé n'existe pas, elle sera ajoutée.

var a = new Array();
a['name'] = 'oscar';
alert(a['name']);

Affichera une boîte de message contenant 'oscar'.

Essayez:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
129
répondu tvanfosson 2012-08-03 01:40:01

D'une manière ou d'une autre, tous les exemples, tout en fonctionnant bien, sont trop compliqués:

  • ils utilisent new Array(), qui est une surcharge (et une surcharge) pour un tableau associatif simple (alias dictionnaire).
  • les meilleurs utilisent new Object(). Fonctionne très bien, mais pourquoi tout cela frappe supplémentaire?

Cette question est étiquetée "débutant", alors simplifions-la.

The uber-un moyen simple d'utiliser un dictionnaire en JavaScript ou " pourquoi JavaScript N'a pas d'objet dictionnaire spécial?":

// create an empty associative array (in JavaScript it is called ... Object)
var dict = {};   // huh? {} is a shortcut for "new Object()"

// add a key named fred with value 42
dict.fred = 42;  // we can do that because "fred" is a constant
                 // and conforms to id rules

// add a key named 2bob2 with value "twins!"
dict["2bob2"] = "twins!";  // we use the subscript notation because
                           // the key is arbitrary (not id)

// add an arbitrary dynamic key with a dynamic value
var key = ..., // insanely complex calculations for the key
    val = ...; // insanely complex calculations for the value
dict[key] = val;

// read value of "fred"
val = dict.fred;

// read value of 2bob2
val = dict["2bob2"];

// read value of our cool secret key
val = dict[key];

Maintenant changeons les valeurs:

// change the value of fred
dict.fred = "astra";
// the assignment creates and/or replaces key-value pairs

// change value of 2bob2
dict["2bob2"] = [1, 2, 3];  // any legal value can be used

// change value of our secret key
dict[key] = undefined;
// contrary to popular beliefs assigning "undefined" does not remove the key

// go over all keys and values in our dictionary
for (key in dict) {
  // for-in loop goes over all properties including inherited properties
  // let's use only our own properties
  if (dict.hasOwnProperty(key)) {
    console.log("key = " + key + ", value = " + dict[key]);
  }
}

Supprimer des valeurs est aussi facile:

// let's delete fred
delete dict.fred;
// fred is removed, the rest is still intact

// let's delete 2bob2
delete dict["2bob2"];

// let's delete our secret key
delete dict[key];

// now dict is empty

// let's replace it, recreating all original data
dict = {
  fred:    42,
  "2bob2": "twins!"
  // we can't add the original secret key because it was dynamic,
  // we can only add static keys
  // ...
  // oh well
  temp1:   val
};
// let's rename temp1 into our secret key:
if (key != "temp1") {
  dict[key] = dict.temp1; // copy the value
  delete dict.temp1;      // kill the old key
} else {
  // do nothing, we are good ;-)
}
477
répondu Eugene Lazutkin 2015-05-07 02:45:25

Javascript n'a pas de tableaux associatifs il a objets.

Les lignes de code suivantes font toutes exactement la même chose - définissez le champ 'name' sur un objet sur 'orion'.

var f = new Object(); f.name = 'orion';
var f = new Object(); f['name'] = 'orion';
var f = new Array(); f.name = 'orion';
var f = new Array(); f['name'] = 'orion';
var f = new XMLHttpRequest(); f['name'] = 'orion';

Il semble que vous ayez un tableau associatif car un Array est aussi un Object - cependant, vous n'ajoutez pas du tout de choses dans le tableau, vous définissez des Champs sur l'objet.

Maintenant que cela est éclairci, voici une solution de travail à votre exemple

var text = '{ name = oscar }'
var dict = new Object();

// Remove {} and spaces
var cleaned = text.replace(/[{} ]/g, '');

// split into key and value
var kvp = cleaned.split('=');

// put in the object
dict[ kvp[0] ] = kvp[1];
alert( dict.name ); // prints oscar.
29
répondu Orion Edwards 2008-12-09 01:47:52

En réponse à MK_Dev, on peut itérer, mais pas consécutivement. (pour cela évidemment un tableau est nécessaire)

Recherche Rapide sur google affiche tables de hachage en javascript

Exemple de code pour boucler des valeurs dans un hachage (à partir du lien susmentionné):

var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;

// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}
9
répondu Danny 2008-12-09 01:37:24

Code Original (j'ai ajouté les numéros de ligne afin de pouvoir se référer à eux):

1  var text = ' name = oscar '
2  var dict = new Array();
3  var keyValuePair = text.split(' = ');
4  dict[ keyValuePair[0] ] = 'whatever';
5  alert( dict ); // prints nothing.

On y est presque...

  • Ligne 1: vous devriez faire un trim sur le texte donc c'est name = oscar.
  • Ligne 3: ok tant que vous avez toujours des espaces autour de votre égal. peut-être mieux de ne pas trim dans la ligne 1, utilisez = et coupez chaque keyValuePair
  • Ajouter une ligne après 3 et avant 4:

    key = keyValuePair[0];`
    
  • Ligne 4: devient maintenant:

    dict[key] = keyValuePair[1];
    
  • Ligne 5: Changement à:

    alert( dict['name'] );  // it will print out 'oscar'
    

Ce que j'essaie de dire, c'est que le dict[keyValuePair[0]] ne fonctionne pas, vous devez définir une chaîne de keyValuePair[0] et de l'utiliser comme clé associative. C'est la seule façon que j'ai eu le mien à travailler. Après l'avoir configuré, vous pouvez vous y référer avec un index numérique ou une clé entre guillemets.

J'espère que ça aide.

4
répondu Andrea 2014-03-12 10:31:56

Tous les navigateurs modernes prennent en charge un Map, qui est une restriction de données clé/valeur. Il y a quelques raisons qui rendent l'utilisation d'une carte meilleure que L'objet:

  • un objet a un prototype, donc il y a des clés par défaut dans la carte.
  • les clés d'un objet sont des chaînes, où elles peuvent être n'importe quelle valeur pour une carte.
  • , Vous pouvez obtenir la taille d'une Carte facilement alors que vous devez garder une trace de la taille d'un Objet.

Exemple:

var myMap = new Map();

var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";

myMap.set(keyString, "value associated with 'a string'");
myMap.set(keyObj, "value associated with keyObj");
myMap.set(keyFunc, "value associated with keyFunc");

myMap.size; // 3

myMap.get(keyString);    // "value associated with 'a string'"
myMap.get(keyObj);       // "value associated with keyObj"
myMap.get(keyFunc);      // "value associated with keyFunc"

Si vous voulez que les clés qui ne sont pas référencées à partir d'autres objets soient récupérées, envisagez d'utiliser un WeakMap au lieu d'une carte.

2
répondu Vitalii Fedorenko 2015-05-07 02:42:13

Je pense que c'est mieux si vous venez de créer comme ceci

var arr = [];

arr = {
   key1: 'value1',
   key2:'value2'
};

Pour plus d'informations, jetez un oeil à ce

Structures De Données JavaScript-Tableau Associatif

2
répondu Karim Samir 2015-06-02 19:31:05
var myArray = new Array();
myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
// show the values stored
for (var i in myArray) {
    alert('key is: ' + i + ', value is: ' + myArray[i]);
}

C'est ok mais itère à travers chaque propriété de l'objet array. si vous voulez seulement parcourir les propriétés myArray.l'un, myArray.de deux... vous essayez comme ça

myArray['one'] = 1;
myArray['two'] = 2;
myArray['three'] = 3;
myArray.push("one");
myArray.push("two");
myArray.push("three");
for(i=0;i<maArray.length;i++{
    console.log(myArray[myArray[i]])
}

Maintenant, vous pouvez accéder à la fois par myArray["one"] et itérer uniquement à travers ces propriétés.

1
répondu Sasinda Rukshan 2012-03-22 16:14:32
var obj = {};

                for (i = 0; i < data.length; i++) {
                    if(i%2==0) {
                        var left = data[i].substring(data[i].indexOf('.') + 1);
                        var right = data[i + 1].substring(data[i + 1].indexOf('.') + 1);

                        obj[left] = right;
                        count++;
                    }
                }
                console.log("obj");
                console.log(obj);
                // show the values stored
                for (var i in obj) {
                    console.log('key is: ' + i + ', value is: ' + obj[i]);
                }

            }
        };

}

1
répondu user2266928 2015-09-08 06:32:50