Supongamos que tengo este código:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Ahora, si quisiera eliminar "apellido" ... ¿hay algún equivalente de
myArray["lastname"].remove()
?
(Necesito que el elemento desaparezca porque la cantidad de elementos es importante y quiero mantener las cosas limpias).
"Test" + {};
es una declaración JS perfectamente válida.Respuestas:
Los objetos en JavaScript pueden considerarse como matrices asociativas, claves de mapeo (propiedades) a valores.
Para eliminar una propiedad de un objeto en JavaScript, utilice el
delete
operador:Tenga en cuenta que cuando
delete
se aplica a una propiedad de índice de unArray
, creará una matriz escasamente poblada (es decir, una matriz con un índice faltante).Cuando trabaje con instancias de
Array
, si no desea crear una matriz escasamente poblada, y generalmente no lo hace, entonces debe usarArray#splice
oArray#pop
.Tenga en cuenta que el
delete
operador en JavaScript no libera memoria directamente. Su propósito es eliminar propiedades de los objetos. Por supuesto, si una propiedad que se elimina contiene la única referencia restante a un objetoo
,o
se recolectará basura de la manera normal.El uso del
delete
operador puede afectar la capacidad de los motores de JavaScript para optimizar el código .fuente
delete myArray[0]
. Ver stackoverflow.com/a/9973592/426379 y Eliminar elementos de la matrizlength
propiedad de un objeto Array permanece sin cambios.myArray
realmente se usara como una matriz, pero no lo es (myArray
es un nombre desafortunado), es un objeto. Entonces en este casodelete
está bien. Tenga en cuenta que incluso si fue creado comonew Array()
y utilizado como matriz asociativa, todavía estaría bien. Sin embargo, su advertencia todavía es algo a tener en cuenta si uno está usando matrices reales.Todos los objetos en JavaScript se implementan como tablas hash / matrices asociativas. Entonces, los siguientes son equivalentes:
Y, como ya se indicó, "elimina" una propiedad de un objeto mediante la
delete
palabra clave, que puede usar de dos maneras:Espero que la información adicional ayude ...
fuente
myObj['some;property']
, funciona, peromyObj.some;property
no lo haría (por razones obvias). Además, puede que no sea obvio que puede usar una variable en la notación de corchetes, es decirvar x = 'SomeProperty'; alert(myObj[x])
Ninguna de las respuestas anteriores aborda el hecho de que Javascript no tiene matrices asociativas para empezar, no hay ningún
array
tipo como tal, veatypeof
.Lo que tiene Javascript son instancias de objetos con propiedades dinámicas. Cuando las propiedades se confunden con elementos de una instancia de objeto Array, es probable que sucedan cosas malas:
Problema
Solución
Para tener una función de eliminación universal que no explote, use:
fuente
Array
s en JS son objetos, pruebetypeof new Array();
otypeof []
verifique.Array
es simplemente un cierto tipo de objeto y no es en absoluto una "bestia diferente". En JS, los objetos se distinguen por su nombre de constructor y cadena de prototipos, consulte Programación basada en prototipos .delete
operador de deficiencia con respecto aArray
proporcionar una función polimórfica simple.delete
no tiene deficienciadelete
está diseñado para eliminar propiedades. Eso es. La aplicación del operador de eliminación a un índice de una matriz elimina ese índice. ¿Qué más necesitas hacer? Te queda una matriz dispersa, que es una característica del lenguaje. Si no desea una matriz dispersa, no elimine el índice: usesplice
opop
.Eso solo elimina elimina el objeto pero aún mantiene la longitud de la matriz igual.
Para eliminar debes hacer algo como:
fuente
Si bien la respuesta aceptada es correcta, le falta la explicación de por qué funciona.
En primer lugar, su código debe reflejar el hecho de que esto NO es una matriz:
Tenga en cuenta que todos los objetos (incluidos los
Array
s) se pueden usar de esta manera. Sin embargo, ¡no espere que las funciones estándar de matriz JS (pop, push, ...) funcionen en objetos!Como se dijo en la respuesta aceptada, puede usar
delete
para eliminar las entradas de los objetos:Debe decidir qué ruta desea tomar: utilice objetos (matrices / diccionarios asociativos) o utilice matrices (mapas). Nunca mezcles los dos.
fuente
Use el método
splice
para eliminar completamente el elemento de una matriz de objetos:fuente
Como han señalado otras respuestas, lo que está utilizando no es una matriz de Javascript, sino un objeto de Javascript, que funciona casi como una matriz asociativa en otros idiomas, excepto que todas las teclas se convierten en cadenas. El nuevo Mapa almacena las claves como su tipo original.
Si tenía una matriz y no un objeto, podría usar la función .filter de la matriz para devolver una nueva matriz sin el elemento que desea eliminar:
Si tiene un navegador y jQuery anteriores, jQuery tiene un
$.grep
método que funciona de manera similar:fuente
Hay una manera elegante en la Guía de estilo de Airbnb para hacer esto (ES7):
Copyright: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
fuente
Estás utilizando Object, no tienes una matriz asociativa para empezar. Con una matriz asociativa, agregar y eliminar elementos es así:
fuente
Puede eliminar una entrada de su mapa asignándola explícitamente a 'indefinido'. Como en tu caso:
fuente
Si por alguna razón la tecla Eliminar no funciona (como si no funcionara para mí)
Puede empalmarlo y luego filtrar los valores indefinidos
No intente encadenarlos ya que el empalme devuelve los elementos eliminados;
fuente
También podemos usarlo como una función. Angular arroja algún error si se usa como prototipo. Gracias @HarpyWar. Me ayudó a resolver un problema.
fuente
Es muy sencillo si tiene dependencia de subrayado.js en su proyecto:
fuente
Al usar la
"delete"
palabra clave, eliminará el elemento de matriz de la matriz en javascript.Por ejemplo,
Considere las siguientes declaraciones.
La última línea del código eliminará el elemento de matriz cuya clave es "estado" de la matriz.
fuente
Sin bucles / iteraciones obtenemos el mismo resultado
fuente
Para "matrices":
Si conoces el índice:
Si conoce el valor:
La respuesta más votada para
delete
funciona bien en el caso de los objetos, pero no para las matrices reales. Si lo usodelete
, elimina elementos de los bucles pero mantiene el elemento comoempty
y la longitud de la matriz no cambiará. Esto puede ser un problema en algunos escenarios.Por ejemplo, si hago myArray.toString () en myArray después de eliminarlo
delete
, crea una entrada vacía, es decir,fuente
El único método de trabajo para mí:
uso:
fuente