390 votos

Cómo crear un diccionario y añadir pares de valores clave dinámicamente en Javascript

Desde el correo:

Enviando una matriz de JSON para ser recibida como un Diccionario<cadena,cadena>

Estoy tratando de hacer lo mismo que ese post, el único problema es que no sé cuáles son las claves y los valores por adelantado. Así que necesito ser capaz de añadir dinámicamente los pares de claves y valores y no sé cómo hacerlo.

¿Alguien sabe cómo crear ese objeto y añadir pares de valores clave dinámicamente?

Lo he intentado:

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

Pero eso no funciona.

2 votos

Funciona muy bien. console.log(vars); show me[ Clave de objeto: "newkey" valor: "newvalue" proto : Objeto ]

0 votos

Salvo que se trata de una lista, no de un diccionario :\N- Creo que los datos se representan mejor como una lista de "pares" también, como list = [["key1","value1"],["key2","value2"]] . Algunos otros lenguajes tienen un tipo de "par", o "tupla". tldr para la adición real de dict: dict['key'] = "value"

646voto

Flambino Puntos 7996
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

Básicamente, estás creando un objeto literal con 2 propiedades (llamado key y value ) e insertarlo (usando push() ) en el Array.

1 votos

@CsabaToth No, dict no es un diccionario asociativo. Es un Array de objetos, cada uno de los cuales es un poco como un diccionario con dos claves: "clave" y "valor".

1 votos

Lo que tienes ahí es un Array que se llama simplemente 'dict'.

4 votos

Agradezco la actualización y el seguimiento de la información adicional.

455voto

Tcll Puntos 33
var dict = {};

dict['key'] = "testing";

console.log(dict);

funciona igual que Python :)

salida de la consola:

Content loaded http://tcll5850.proboards.com/thread/216/characters-plugin-finally-development-needed content.js:15
GET http://s20219.storage.proboards.com/3080219/c/.css 404 (Not Found) characters-plugin-finally-development-needed:366
GET http://ads.pro-market.net/ads/scripts/site-131222.js  characters-plugin-finally-development-needed:719
Object {key: "testing"} MHMrzdNTH8femoLd92L5.js:21
GET http://track.netshelter.net/async/js/sites/proboards.com-async.js  characters-plugin-finally-development-needed:723
GET http://tcr.tynt.com/ti.js  characters-plugin-finally-development-needed:1115
GET http://www.google-analytics.com/ga.js  characters-plugin-finally-development-needed:1141
GET http://cdn.insights.gravity.com/moth-min.js  characters-plugin-finally-development-needed:712
GET http://rma-api.gravity.com/v1/api/intelligence/wl?jq=1.7.2&sg=a1f9015c15922698596d7c5bdd1561c2&ug=&pl=11&id=grv-end-of-post  characters-plugin-finally-development-needed:712
GET http://cdn.viglink.com/api/vglnk.js  characters-plugin-finally-development-needed:1155
event.returnValue is deprecated. Please use the standard event.preventDefault() instead. jquery.min.js:3
1 _global.newCID:false VM3420:2

nota: Objeto {clave: "probando"}

4 votos

Este es sin duda el mejor enfoque para construir un diccionario, ¡y ES la respuesta correcta!

4 votos

Es muy importante inicializar con paréntesis {} en lugar de paréntesis

0 votos

También utilizo objetos básicos como diccionarios como este. ¡Me alegra ver que es la forma correcta!

56voto

Simon Sarris Puntos 33799

Es tan simple como:

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

o

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

entonces

blah.key3 = value3; // add a new key/value pair
blah.key2; // returns value2
blah['key2']; // also returns value2

1 votos

@KenEucker Creo que es útil tener respuestas incorrectas en preguntas como esta. Sobre todo si alguien explica por qué se equivocan, es un buen recurso de aprendizaje.

33voto

ZenMaster Puntos 4209

Ya que has declarado que quieres un objeto de diccionario (y no un Array como supongo que algunos lo entendieron) Creo que esto es lo que buscas:

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

0 votos

La otra solución usando .push en un Array funciona para mis usos, pero supongo que esto también funcionaría si lo probara.

2 votos

A menos que entienda mal lo que es un objeto Diccionario, su pregunta es engañosa entonces. ¿Cómo recuperarías un valor por clave de tu Array?

0 votos

Estoy usando JSON.stringify en este objeto y luego lo capturo con un controlador en MVC 3. Esto es sólo para que se formatee correctamente antes de encadenarlo y enviarlo.

3voto

redcap3000 Puntos 126

Me encontré con este problema pero dentro de un bucle for. La solución superior no funcionó (al usar variables (y no cadenas) para los parámetros de la función de empuje), y las otras no tuvieron en cuenta los valores clave basados en variables. Me sorprendió que este enfoque (que es común en PHP) funcionara..

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X