cómo eliminar clave + valor de hash en javascript

78

Dado

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key2'] = { Name: 'Object 2' };
myHash['key3'] = { Name: 'Object 3' };

¿Cómo elimino key2, y object 2del hash, para que termine en un estado como si lo hiciera?

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key3'] = { Name: 'Object 3' };

eliminar no hace lo que quiero;

delete myHash['key2'] 

simplemente me da esto:

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myhash['key2'] = null;
myHash['key3'] = { Name: 'Object 3' };

los únicos documentos que puedo encontrar splicey slicetratar con indexadores de enteros, que no tengo.

Editar: tampoco sé si 'key2' está necesariamente en la posición [1]

ACTUALIZAR

OK, una pequeña pista falsa, la eliminación parece hacer lo que quiero en la superficie, sin embargo, estoy usando json2.js para encadenar mi objeto a json para devolverlo al servidor,

después de haber eliminado, myHash se serializa como:

[ { Name: 'Object 1' }, null, { Name: 'Object 3' } ]

¿Es esto un error en json2.js? ¿O es algo que estoy haciendo mal al eliminar?

Gracias

Andrew Bullock
fuente
3
Lo que está haciendo es agregar propiedades a un objeto, que es diferente a agregar elementos a una matriz / hash. Está buscando una forma de eliminar una propiedad, más o menos. Intente eliminar myHash.key1, como se menciona en otros comentarios.
David Andres
2
Si es una tabla hash, debería usar en var myHash = new Object()lugar de var myHash = new Array().
cprcrack

Respuestas:

183

Estas buscando delete:

delete myhash['key2']

Consulte la guía básica de JavaScript

karim79
fuente
1
Pensé que esto era correcto, por eso lo probé en primer lugar. No parece que el trabajo, mi problema está en realidad en JSON.stringify, actualizar enferma la pregunta
Andrew Bullock
8
utilice la función de empalme en su lugar. Eliminar deja un agujero en la matriz.
David Andres
2
Aquí está la función de empalme antes mencionada por cierto.
Per Lundberg
Esta no es la mejor opción cuando los cambios myhashdeben tener lugar solo en el ámbito actual. deletepuede tener efectos secundarios si las variables en otros lugares se refieren al myhashobjeto.
Pleaner máximo
Made my day @ karim79 tysm
11

¿Por qué lo usas new Array();para hash? Necesitas usar new Object()en su lugar.

Y creo que obtendrás lo que quieres.

Eldar Djafarov
fuente
4
No me gusta nada nuevo. Prefiero var myHash = [];
Nosredna
10
O en este caso, myHash = {}; :-)
Nosredna
Estoy de acuerdo. Lo único que le da una matriz es una longitud que nunca funciona cuando cambia el indexador por algo que no sea un int.
Your Friend Ken
6

Dice que no necesariamente sabe que 'key2' está en la posición [1]. Bueno, no lo es. La posición 1 estaría ocupada por myHash [1].

Está abusando de las matrices de JavaScript, que (al igual que las funciones) permiten hashes de clave / valor. Aunque JavaScript lo permite, no le da facilidades para manejarlo, como lo haría un lenguaje diseñado para matrices asociativas. Los métodos de matriz de JavaScript funcionan solo con las propiedades numeradas.

Lo primero que debe hacer es cambiar a objetos en lugar de matrices. No tiene una buena razón para usar una matriz aquí en lugar de un objeto, así que no lo haga. Si desea utilizar una matriz, simplemente numere los elementos y renuncie a la idea de hash. La intención de una matriz es contener información que se pueda indexar numéricamente.

Por supuesto, puede poner un hash (objeto) en una matriz si lo desea.

myhash[1]={"key1","brightOrangeMonkey"};
Nosredna
fuente
1

Otra opción puede ser este método de eliminación de John Resig . puede adaptarse mejor a lo que necesita. si conoce el índice en la matriz.

andres descalzo
fuente
2
bueno, no tener el índice es exactamente lo que dice la pregunta
Andrew Bullock
Hola @AndrewBullock Tengo una consulta, obtengo una matriz JSON Ex: [{\ "Countrycode \": \ "DE \", \ "count \": \ "3 \"}] pero quiero obtener como [{"DE ":" 3 "}] así, pero no obtengo este resultado. Por favor, ayúdame