Question

Comment créer des clés de manière dynamique 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 j’ai divisé la chaîne et obtenu 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.
Était-ce utile?

La solution

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

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

Une boîte de message contenant "oscar" apparaîtra.

Essayez:

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

Autres conseils

D'une certaine manière, 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.

La méthode la plus simple d'utilisation d'un dictionnaire en JavaScript ou & "; Pourquoi JavaScript n'a pas d'objet dictionnaire spécial? &"; quot:

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

Modifions maintenant 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 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 ne possède pas de tableaux associatifs , il contient 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 au tableau, vous définissez des champs sur l'objet.

Maintenant que tout est réglé, voici une solution efficace 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.

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

Une recherche rapide dans Google affiche les les tables de hachage en javascript

.

Exemple de code permettant d'effectuer une boucle 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]);
}

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 devez faire un trim texte afin qu'il soit name = oscar.
  • ligne 3: ok tant que vous avez TOUJOURS des espaces autour de votre égal.       Il serait peut-être préférable de ne pas = dans la ligne 1, utilisez dict[keyValuePair[0]] et découpez 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: Remplacez par:

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

Ce que j'essaie de dire, c'est que le keyValuePair[0] ne fonctionne pas, vous devez définir une chaîne sur <=> et l'utiliser comme clé associative. C'est la seule façon pour moi de faire travailler les miens. Après l'avoir configuré, vous pouvez vous y reporter avec un index numérique ou entrer des guillemets.

L’espoir que cela aide.

Tous les navigateurs modernes prennent en charge une carte . , qui est une restriction 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 veillant à 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 récupérées, utilisez un WeakMap au lieu d'une carte.

Je pense que c'est mieux si vous venez 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

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 correct, mais itère toutes les propriétés 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 [& "; un &";] et effectuer une itération uniquement via 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]);
                }

            }
        };

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top