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.
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]] );
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 ;-)
}
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.
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]);
}
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'estname = 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.
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.
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
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.
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]);
}
}
};
}