Crear claves dinámicamente en una matriz asociativa de JavaScript

Resuelto OscarRyz asked hace 16 años • 10 respuestas

Toda la documentación que he encontrado hasta ahora es para actualizar claves que ya están creadas:

 arr['key'] = val;

Tengo una cadena como esta:" name = oscar "

Y quiero terminar con algo como esto:

{ name: 'whatever' }

Es decir, divida la cadena y obtenga el primer elemento y luego colóquelo en un diccionario.

Código

var text = ' name = oscar '
var dict = new Array();
var keyValuePair = text.split(' = ');
dict[ keyValuePair[0] ] = 'whatever';
alert( dict ); // Prints nothing.
OscarRyz avatar Dec 09 '08 08:12 OscarRyz
Aceptado

De alguna manera, todos los ejemplos, aunque funcionan bien, son demasiado complicados:

  • Usan new Array(), que es una exageración (y una sobrecarga) para una matriz asociativa simple (también conocida como diccionario).
  • Los mejores usan new Object(). Funciona bien, pero ¿por qué escribir tanto de más?

Esta pregunta está etiquetada como "principiante", así que hagámosla simple.

La forma súper sencilla de utilizar un diccionario en JavaScript o "¿Por qué JavaScript no tiene un objeto de diccionario especial?":

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

Ahora cambiemos valores:

// Change the value of fred
dict.fred = "astra";
// The assignment creates and/or replaces key-value pairs

// Change the 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) {
  // A 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]);
  }
}

Eliminar valores también es fácil:

// Let's delete fred
delete dict.fred;
// fred is removed, but 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, but
  // 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 ;-)
}
Eugene Lazutkin avatar Dec 09 '2008 03:12 Eugene Lazutkin

Utilice el primer ejemplo. Si la clave no existe, se agregará.

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

Aparecerá un cuadro de mensaje que contiene "oscar".

Intentar:

var text = 'name = oscar'
var dict = new Array()
var keyValuePair = text.replace(/ /g,'').split('=');
dict[ keyValuePair[0] ] = keyValuePair[1];
alert( dict[keyValuePair[0]] );
tvanfosson avatar Dec 09 '2008 01:12 tvanfosson

JavaScript no tiene matrices asociativas . Tiene objetos .

Todas las siguientes líneas de código hacen exactamente lo mismo: establecer el campo 'nombre' de un objeto en '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';

Parece que tienes una matriz asociativa porque an Arraytambién es an Object; sin embargo, en realidad no estás agregando cosas a la matriz en absoluto; estás configurando campos en el objeto.

Ahora que eso está claro, aquí tienes una solución funcional para tu ejemplo:

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.
Orion Edwards avatar Dec 09 '2008 01:12 Orion Edwards

En respuesta a MK_Dev, se puede iterar, pero no de forma consecutiva (para eso, obviamente se necesita una matriz).

Una búsqueda rápida en Google muestra tablas hash en JavaScript .

Código de ejemplo para recorrer valores en un hash (del enlace antes mencionado):

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]);
}
Danny avatar Dec 09 '2008 01:12 Danny