207 votes

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

Comment puis-je dynamiquement créer des touches en javascript tableaux associatifs ?

Toute la documentation que j’ai trouvée jusqu'à présent est de mettre à jour les clés qui sont déjà créées :

J’ai une chaîne comme ceci``

Et je veux finir avec quelque chose comme ceci :

Voilà j’ai découper la chaîne et obtenir le premier élément, et je veux mettre ça dans un dictionnaire.

Code

492voto

Eugene Lazutkin Points 22414

En quelque sorte, tous les exemples, tandis que bien, sont extrêmement compliquées:

  • Ils utilisent new Array(), ce qui est inutile (et un rétroprojecteur) pour un simple tableau associatif (AKA dictionnaire).
  • La meilleure utilisation new Object(). Fonctionne très bien, mais pourquoi toute cette saisie de texte supplémentaire?

Cette question est taggés "débutant", donc, nous allons faire simple.

Le super-simple façon d'utiliser un dictionnaire en JavaScript ou "Pourquoi JavaScript n'est pas un spécial dictionnaire de l'objet?":

// 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, nous allons changer 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]);
  }
}

La suppression de valeurs est trop 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 ;-)
}

149voto

tvanfosson Points 268301

Utilisez le premier exemple. Si la clé n’existe pas il sera ajouté.

Apparaîtra une boîte de message contenant « oscar ».

Essayez :

29voto

Orion Edwards Points 54939

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

Les lignes de code suivantes tous faire exactement la même chose - pour définir le champ "nom", sur un objet '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 avez un tableau associatif, car un Array est aussi un Object - mais vous n'êtes pas d'ajouter des éléments dans le tableau, vous êtes à la définition des champs de l'objet.

Maintenant que c'est clarifié, voici une solution qui fonctionne pour 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.

9voto

Danny Points 2433

En réponse à MK_Dev, on est capable d'itérer, mais pas de manière consécutive. (Pour cela, évidemment, un tableau est nécessaire)

La recherche rapide sur google fait apparaître des 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]);
}
 

5voto

Andrea Points 31

Le Code d'origine (j'ai ajouté les numéros de ligne afin de pouvoir les consulter):

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 de sorte qu'il est name = oscar.
  • ligne 3: ok aussi longtemps que vous avez TOUJOURS des espaces autour de votre égal. peut-être mieux de ne pas le trim dans la ligne 1, utilisez = et découper chaque keyValuePair
  • ajouter une ligne au bout de 3 et avant le 4:

    key = keyValuePair[0];`
    
  • ligne 4: devient Maintenant:

    dict[key] = keyValuePair[1];
    
  • ligne 5: évolution de:

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

Ce que j'essaie de dire, c'est que l' dict[keyValuePair[0]] ne fonctionne pas, vous devez définir une chaîne d' 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 soit le consulter avec index numérique ou d'une clé entre guillemets.

Espérons que cela aide.

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