Creación dinámica de keys en una matriz asociativa de JavaScript

¿Cómo puedo crear keys dinámicamente en matrices asociativas javascript?

Toda la documentation que he encontrado hasta ahora es para actualizar las keys que ya están creadas:

arr['key'] = val; 

Tengo una cadena como esta " name = oscar "

Y quiero terminar con algo como esto:

 { name: 'whatever' } 

Eso es dividir la cadena y get el primer elemento, y quiero poner eso en un dictionary.

Código

 var text = ' name = oscar ' var dict = new Array(); var keyValuePair = text.split(' = '); dict[ keyValuePair[0] ] = 'whatever'; alert( dict ); // prints nothing. 

Usa el primer ejemplo. Si la key no existe, se agregará.

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

Aparecerá un cuadro de post que contiene 'oscar'.

Tratar:

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

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

  • Usan el new Array() , que es una exageración (y una sobrecarga) para una matriz asociativa simple (dictionary AKA).
  • Los mejores usan new Object() . Funciona bien, pero ¿por qué todo este tipeo extra?

Esta pregunta está labelda como "principiante", así que hagámoslo simple.

La forma más sencilla de usar un dictionary en JavaScript o "¿Por qué JavaScript no tiene un object de dictionary 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 fnetworking with value 42 dict.fnetworking = 42; // we can do that because "fnetworking" 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 "fnetworking" val = dict.fnetworking; // read value of 2bob2 val = dict["2bob2"]; // read value of our cool secret key val = dict[key]; 

Ahora cambiemos los valores:

 // change the value of fnetworking dict.fnetworking = "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]); } } 

Eliminar valores también es fácil:

 // let's delete fnetworking delete dict.fnetworking; // fnetworking 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 = { fnetworking: 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 no tiene matrices asociativas , tiene objects .

Las siguientes líneas de código hacen exactamente lo mismo: configure el campo 'nombre' de un object como '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 una Array también es un Object ; sin embargo, en realidad no estás agregando cosas en la matriz, estás configurando campos en el object.

Ahora que está aclarado, aquí hay una solución de trabajo para su 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. 

En respuesta a MK_Dev, uno puede iterar, pero no consecutivamente. (Para eso, obviamente, se necesita una matriz)

La búsqueda rápida en Google muestra tablas hash en javascript

Código de ejemplo para el bucle de valores en un hash (del enlace mencionado anteriormente):

 var myArray = new Array(); myArray['one'] = 1; myArray['two'] = 2; myArray['three'] = 3; // show the values stonetworking for (var i in myArray) { alert('key is: ' + i + ', value is: ' + myArray[i]); } 

Código original (agregué los numbers de línea para poder referirme a ellos):

 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. 

Casi ahí …

  • línea 1: debe hacer un trim en el text para que sea name = oscar .
  • línea 3: está bien siempre y cuando SIEMPRE tenga espacios alnetworkingedor de su igual. podría ser mejor no trim en la línea 1, usar = y recortar cada keyValuePair
  • agregue una línea después de 3 y antes de 4:

     key = keyValuePair[0];` 
  • línea 4: Ahora se convierte en:

     dict[key] = keyValuePair[1]; 
  • línea 5: cambiar a:

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

Lo que trato de decir es que el dict[keyValuePair[0]] no funciona, necesita establecer una cadena en keyValuePair[0] y usar eso como la key asociativa. Esa es la única forma en que conseguí que el mío funcionara. Después de configurarlo, puede consultarlo con un índice numérico o entre comillas.

Espero que ayude.

Todos los browseres modernos admiten un Mapa , que es una restricción de datos key / valor. Hay un par de razones que hacen que usar un Mapa sea mejor que un Objeto:

  • Un object tiene un prototipo, por lo que hay keys pnetworkingeterminadas en el map.
  • Las keys de un object son cadenas, donde pueden ser cualquier valor para un map.
  • Puede get el tamaño de un Mapa fácilmente mientras tiene que hacer un seguimiento del tamaño de un Objeto.

Ejemplo:

 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 quiere que las keys que no están referencedas desde otros objects sean recolectadas, considere usar un WeakMap en lugar de un Map.

 var myArray = new Array(); myArray['one'] = 1; myArray['two'] = 2; myArray['three'] = 3; // show the values stonetworking for (var i in myArray) { alert('key is: ' + i + ', value is: ' + myArray[i]); } 

esto está bien, pero itera a través de cada propiedad del object de la matriz. si solo desea iterar a través de las properties myArray.one, myArray.two … intente así

 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]]) } 

ahora puede acceder a ambos mediante myArray ["one"] e iterar solo a través de estas properties.

Creo que es mejor si acabas de crear así

 var arr = []; arr = { key1: 'value1', key2:'value2' }; 

para más información, échale un vistazo a esto

Estructuras de datos de JavaScript: matriz asociativa

 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 stonetworking for (var i in obj) { console.log('key is: ' + i + ', value is: ' + obj[i]); } } }; 

}