web-dev-qa-db-fra.com

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

Comment 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 ceci " name = oscar "

Et je veux finir avec quelque chose comme ça:

{ name: 'whatever' }

C'est-à-dire que je scie la chaîne et récupère 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.
196
OscarRyz

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

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

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

Essayer:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
141
tvanfosson

D'une manière ou d'une autre, tous les exemples, même s'ils fonctionnent bien, sont trop compliqués:

  • Ils utilisent new Array(), qui est une surcharge (et un overhead) pour un tableau associatif simple (dictionnaire AKA).
  • Les meilleurs utilisent new Object(). Fonctionne bien, mais pourquoi toute cette saisie supplémentaire?

Cette question est étiquetée "débutant", alors simplifions les choses.

Le moyen le plus simple d'utiliser un dictionnaire en JavaScript ou "Pourquoi JavaScript n'a pas d'objet dictionnaire particulier?":

// 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]);
  }
}

La suppression de valeurs est également 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 ;-)
}
484
Eugene Lazutkin

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 "nom" d'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 également un Object. Cependant, vous n'ajoutez pas d'éléments 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
Orion Edwards

En réponse à MK_Dev, on peut effectuer une itération, mais pas consécutivement. (Un tableau est évidemment nécessaire).

Une recherche google rapide affiche tables de hachage en javascript

Exemple de code pour boucler sur les valeurs d'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
Danny

Code d'origine (j'ai ajouté les numéros de ligne afin de pouvoir y faire référence):

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.

Presque là...

  • ligne 1: vous devriez faire un trim sur le texte pour qu'il soit name = oscar.
  • ligne 3: ok tant que vous avez TOUJOURS des espaces autour de votre égal. peut-être préférable de ne pas trim à la ligne 1, utilisez = et ajustez chaque valeur KeyValuePair
  • ajoutez une ligne après 3 et avant 4:

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

    dict[key] = keyValuePair[1];
    
  • ligne 5: Changer en:

    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 sur keyValuePair[0] et l'utiliser comme clé associative. C'est la seule façon pour moi de faire travailler les miens. Une fois que vous l'avez configuré, vous pouvez vous y reporter avec un index numérique ou entrer des guillemets.

J'espère que ça t'as aidé.

4
Andrea

Tous les navigateurs modernes supportent un Map , qui est une stricture de données clé/valeur. L’utilisation d’une carte est meilleure qu’un objet pour plusieurs raisons:

  • Un objet a un prototype, il y a donc 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 facilement obtenir la taille d'une carte tout en gardant 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 souhaitez que les clés qui ne sont pas référencées à partir d'autres objets soient collectées, utilisez un WeakMap au lieu d'une Map.

3

Je pense que c'est mieux si tu viens de créer comme ça

var arr = [];

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

pour plus d'informations, jetez un coup d'oeil à cette

Structures de données JavaScript - Tableau associatif

3
Karim Samir
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
user2266928
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 tableau. si vous voulez seulement parcourir les propriétés myArray.one, myArray.two ... 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 via ces propriétés.

1
Sasinda Rukshan