Comment créer le dictionnaire et ajouter des paires clé–valeur dynamiquement?

De la poste:

envoyer un tableau JSON pour être reçu comme un dictionnaire

j'essaie de faire la même chose que ce post. Le seul problème, c'est que je ne sais pas quelles sont les clés et les valeurs. Donc j'ai besoin d'être en mesure d'ajouter dynamiquement les paires clé-valeur et je ne sais pas comment faire.

est-ce que quelqu'un sait comment créer cet objet et ajouter des paires de valeurs clés dynamiquement?

j'ai essayé:

var vars = [{key:"key", value:"value"}];
vars[0].key = "newkey";
vars[0].value = "newvalue";

mais ça ne marche pas.

211
demandé sur Xufox 2011-08-25 23:39:10

13 réponses

var dict = []; // create an empty array

dict.push({
    key:   "keyName",
    value: "the value"
});
// repeat this last part as needed to add more key/value pairs

fondamentalement, vous créez un objet littéral avec 2 propriétés (appelé key et value ) et l'insérez (en utilisant push() ) dans le tableau.


Edit: donc presque 5 ans plus tard, cette réponse est en baisse parce qu'elle ne crée pas un objet" normal " js littéral (aka map, aka hash, aka dictionary).

est toutefois la création de la structure que OP demandé (et qui est illustrée dans l'autre question liée à), qui est un tableau d'objets littéraux , chacun avec key et value propriétés. Ne me demandez pas pourquoi cette structure était nécessaire, mais c'est celui qui a été demandé.

Mais, Mais, si ce que vous voulez dans un objet JS simple-et pas la structure OP demandé pour-voir la réponse de tcll , bien que la notation des crochets soit un peu encombrante si vous avez juste des clés simples qui sont des noms js valides. Vous pouvez simplement faire ceci:

// object literal with properties
var dict = {
  key1: "value1",
  key2: "value2"
  // etc.
};

ou utilisez la notation par points régulière pour définir les propriétés après avoir créé un objet:

// empty object literal with properties added afterward
var dict = {};
dict.key1 = "value1";
dict.key2 = "value2";
// etc.

vous do voulez la notation bracket si vous avez des clés qui ont des espaces en eux, des caractères spéciaux, ou des choses comme ça. Par exemple:

var dict = {};

// this obviously won't work
dict.some invalid key (for multiple reasons) = "value1";

// but this will
dict["some invalid key (for multiple reasons)"] = "value1";

You vous voulez aussi la notation des brackets si vos clés sont dynamiques:

dict[firstName + " " + lastName] = "some value";

notez que les clés (noms de propriétés) sont toujours des chaînes de caractères, et que les valeurs non-string seront imposées à une chaîne de caractères lorsqu'elle est utilisée comme clé. Par exemple: un objet Date est converti en sa représentation string:

dict[new Date] = "today's value";

console.log(dict);
// => {
//      "Sat Nov 04 2016 16:15:31 GMT-0700 (PDT)": "today's value"
//    }

notez cependant que cela ne "fonctionne pas nécessairement", car de nombreux objets auront une représentation string comme "[object Object]" qui ne fait pas pour un non-unique clé. Alors méfiez-vous de quelque chose comme:

var objA = { a: 23 },
    objB = { b: 42 };

dict[objA] = "value for objA";
dict[objB] = "value for objB";

console.log(dict);
// => { "[object Object]": "value for objB" }

bien que objA et objB soient des éléments complètement différents et uniques, ils ont tous les deux la même représentation de chaîne de base: "[object Object]" .

la raison pour laquelle Date ne se comporte pas comme ceci est que le prototype Date a une méthode personnalisée toString qui l'emporte sur la représentation de chaîne par défaut. Et vous pouvez faire la même chose:

// a simple constructor with a toString prototypal method
function Foo() {
  this.myRandomNumber = Math.random() * 1000 | 0;
}

Foo.prototype.toString = function () {
  return "Foo instance #" + this.myRandomNumber;
};

dict[new Foo] = "some value";

console.log(dict);
// => {
//      "Foo instance #712": "some value"
//    }

(notez que puisque le chiffre ci-dessus utilise un aléatoire , les collisions de noms peuvent encore se produire très facilement. C'est juste pour illustrer une implémentation de toString .)

ainsi, en essayant d'utiliser des objets comme clés, JS utilisera la propre implémentation toString de l'objet, le cas échéant, ou utilisera la représentation de chaîne par défaut.

373
répondu Flambino 2017-05-23 12:18:26
var dict = {};

dict['key'] = "testing";

console.log(dict);

fonctionne comme python:)

sortie de la console:

Object {key: "testing"} 
313
répondu Tcll 2017-02-22 08:04:10

C'est aussi simple que:

var blah = {}; // make a new dictionary (empty)

ou

var blah = {key: value, key2: value2}; // make a new dictionary with two pairs 

puis

blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2
50
répondu Simon Sarris 2011-08-25 19:54:04

puisque vous avez déclaré que vous voulez un objet de dictionnaire (et pas un tableau comme je suppose que certains ont compris) je pense que c'est ce que vous êtes après:

var input = [{key:"key1", value:"value1"},{key:"key2", value:"value2"}];

var result = {};

for(var i = 0; i < input.length; i++)
{
    result[input[i].key] = input[i].value;
}

console.log(result); // Just for testing
31
répondu ZenMaster 2011-08-25 20:04:57

JavaScript Object est en soi comme un dictionnaire. Pas besoin de réinventer la roue.

var dict = {};

// Adding key-value -pairs
dict['key'] = 'value'; // Through indexer
dict.anotherKey = 'anotherValue'; // Through assignment

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:key value:value
  // key:anotherKey value:anotherValue
}

// Non existent key
console.log(dict.notExist); // undefined

// Contains key?
if (dict.hasOwnProperty('key')) {
  // Remove item
  delete dict.key;
}

// Looping through
for (var item in dict) {
  console.log('key:' + item + ' value:' + dict[item]);
  // Output
  // key:anotherKey value:anotherValue
}

Violon

16
répondu Jani Hyytiäinen 2016-02-19 15:44:44

il se trouve que j'ai marché à travers cette question à la recherche de quelque chose de similaire. Ça m'a donné assez d'infos pour faire un test pour avoir la réponse que je voulais. Donc, si quelqu'un d'autre veut savoir comment ajouter dynamiquement ou rechercher une paire {key: 'value'} dans un objet JavaScript, ce test devrait vous dire tout ce que vous pourriez avoir besoin de savoir.

var dictionary = {initialkey: 'initialValue'};
var key = 'something';
var key2 =  'somethingElse';
var value = 'value1';
var value2 = 'value2';
var keyInitial = 'initialkey';

console.log(dictionary[keyInitial]);

dictionary[key] =value;
dictionary[key2] = value2;
console.log(dictionary);

sortie

initialValue
{ initialkey: 'initialValue',
  something: 'value1',
  somethingElse: 'value2' }
8
répondu user2301449 2015-01-02 02:11:18
var dictionary = {};//create new object
dictionary["key1"] = value1;//set key1
var key1 = dictionary["key1"];//get key1
6
répondu SharpCoder 2014-06-02 13:35:12

vous pouvez utiliser des cartes avec Map , comme ceci:

var sayings = new Map();
sayings.set('dog', 'woof');
sayings.set('cat', 'meow');
4
répondu Preetham Kumar P 2018-02-07 02:35:11

vous pouvez créer un dictionnaire de classe de sorte que vous pouvez interagir avec la liste de dictionnaire facilement:

class Dictionary {
  constructor() {
    this.items = {};
  }
  has(key) {
    return key in this.items;
  }
  set(key,value) {
    this.items[key] = value;
  }
  delete(key) {
    if( this.has(key) ){
      delete this.items[key]
      return true;
    }
    return false;
  }
}

var d = new Dictionary();
d.set(1, "value1")
d.set(2, "value2")
d.set(3, "value3")
console.log(d.has(2));
d.delete(2);
console.log(d.has(2));
2
répondu agonza1 2018-05-04 14:23:08

j'ai rencontré ce problème.. mais à l'intérieur d'une boucle for. La solution top ne fonctionnait pas (lorsqu'on utilisait des variables (et non des chaînes) pour les paramètres de la fonction push), et les autres ne tenaient pas compte des valeurs clés basées sur les variables. J'ai été surpris que cette approche (qui est commune dans php) ait fonctionné..

  // example dict/json                  
  var iterateDict = {'record_identifier': {'content':'Some content','title':'Title of my Record'},
    'record_identifier_2': {'content':'Some  different content','title':'Title of my another Record'} };

  var array = [];

  // key to reduce the 'record' to
  var reduceKey = 'title';

  for(key in iterateDict)
   // ultra-safe variable checking...
   if(iterateDict[key] !== undefined && iterateDict[key][reduceKey] !== undefined)
    // build element to new array key
     array[key]=iterateDict[key][reduceKey];
1
répondu redcap3000 2012-07-24 22:13:57

qu'en est-il de la doublure unique pour créer une paire de valeurs clés?

let result = { ["foo"]: "some value" };

et une fonction d'itérateur comme reduce pour convertir dynamiquement un tableau en un dictionnaire

var options = [
  { key: "foo", value: 1 },
  { key: "bar", value: {id: 2, name: "two"} },
  { key: "baz", value: {["active"]: true} },
];

var result = options.reduce((accumulator, current) => {
  accumulator[current.key] = current.value;
  return accumulator;
}, {});

console.log(result);
1
répondu Dan Dohotaru 2018-02-16 23:26:46

ça aiderait une tonne de savoir quel est votre résultat final désiré, mais je pense que c'est ce que vous voulez:

var vars = [{key:"key", value:"value"}];

vars.push({key: "newkey", value: "newvalue"})
0
répondu g.d.d.c 2011-08-25 19:46:43

une amélioration par rapport à var dict = {} est d'utiliser var dict = Object.create(null) .

cela créera un objet vide qui ne pas ont Object.prototype comme prototype.

var dict1 = {};
if (dict1["toString"]){
    console.log("Hey, I didn't put that there!")
}
var dict2 = Object.create(null);
if (dict2["toString"]){
    console.log("This line won't run :)")
}
0
répondu WoodenKitty 2016-07-20 07:53:57