recorrer objetos indice elementos dinamico con claves asociativos asociativo array agregar javascript associative-array

objetos - Creación dinámica de claves en una matriz asociativa de JavaScript



arrays asociativos javascript (9)

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

Toda la documentación que he encontrado hasta ahora es para actualizar las 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'' }

Eso es dividir la cadena y obtener el primer elemento, y quiero poner eso 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.


Código original (agregué los números 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 texto para que sea name = oscar .
  • línea 3: está bien siempre y cuando SIEMPRE tenga espacios alrededor 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 clave 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.



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 (diccionario AKA).
  • Los mejores usan new Object() . Funciona bien, pero ¿por qué todo este tipeo extra?

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

La forma más sencilla de usar 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 los valores:

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

Eliminar valores también es fácil:

// 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 ;-) }


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 stored for (var i in myArray) { alert(''key is: '' + i + '', value is: '' + myArray[i]); }


Javascript no tiene matrices asociativas , tiene objetos .

Las siguientes líneas de código hacen exactamente lo mismo: configure el campo ''nombre'' de un objeto 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 objeto.

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.


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

  • Un objeto tiene un prototipo, por lo que hay claves predeterminadas en el mapa.
  • Las claves de un objeto son cadenas, donde pueden ser cualquier valor para un mapa.
  • Puede obtener 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 desea que las claves que no están referenciadas desde otros objetos sean recolectadas, considere usar un WeakMap lugar de un Map.


Usa 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''.

Tratar:

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


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

esto está bien, pero itera a través de cada propiedad del objeto de la matriz. si solo desea iterar a través de las propiedades 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 propiedades.


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

}