Digamos que creo un objeto de la siguiente manera:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
¿Cuál es la mejor manera de eliminar la propiedad regex
para terminar con la nueva de la myObject
siguiente manera?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
johnstok
fuente
fuente
delete
, sería la opción más lenta ya que es una operación real en lugar de las otras dos, que son solo tareas simples. Pero el quid de la cuestión es que la asignación de la propiedad denull
, oundefined
en realidad no quitar la propiedad del objeto, sino que establece que la propiedad a igual a un valor constante en particular. (Las respuestas a continuación dan razones por las cuales esta es una diferencia significativa.)Respuestas:
Me gusta esto:
Manifestación
Para cualquier persona interesada en leer más sobre esto, el usuario de Stack Overflow kangax ha escrito una publicación de blog increíblemente profunda sobre la
delete
declaración en su blog, Entendiendo la eliminación . Es muy recomendablefuente
var x = {a : 'A', b : 'B'};
Comparar:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
ax.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Los objetos en JavaScript pueden considerarse mapas entre claves y valores. El
delete
operador se utiliza para eliminar estas claves, más comúnmente conocidas como propiedades de objeto, una a la vez.El
delete
operador no directamente memoria libre, y se diferencia de la simple asignación del valor denull
oundefined
a una propiedad, en el que la propiedad en sí es retirado del objeto. Tenga en cuenta que si el valor de una propiedad eliminada era un tipo de referencia (un objeto), y otra parte de su programa todavía tiene una referencia a ese objeto, entonces ese objeto, por supuesto, no se recolectará basura hasta que todas las referencias a él tengan desaparecidodelete
solo funcionará en propiedades cuyo descriptor los marque como configurables.fuente
Esto funciona en Firefox e Internet Explorer, y creo que funciona en todos los demás.
fuente
El
delete
operador se utiliza para eliminar propiedades de los objetos.Tenga en cuenta que, para las matrices, esto no es lo mismo que eliminar un elemento . Para eliminar un elemento de una matriz, use
Array#splice
oArray#pop
. Por ejemplo:Detalles
delete
en JavaScript tiene una función diferente a la de la palabra clave en C y C ++: no libera memoria directamente. En cambio, su único propósito es eliminar propiedades de los objetos.Para las matrices, al eliminar una propiedad correspondiente a un índice, se crea una matriz dispersa (es decir, una matriz con un "agujero"). La mayoría de los navegadores representan estos índices de matriz faltantes como "vacíos".
Tenga en cuenta que
delete
no se trasladaarray[3]
aarray[2]
.Las diferentes funciones integradas en JavaScript manejan matrices dispersas de manera diferente.
for...in
saltará el índice vacío por completo.Un
for
bucle tradicional devolveráundefined
el valor en el índice.Cualquier método que use
Symbol.iterator
devolveráundefined
el valor en el índice.forEach
,map
yreduce
simplemente omitirá el índice que falta.Por lo tanto, el
delete
operador no debe usarse para el caso de uso común de eliminar elementos de una matriz. Las matrices tienen métodos dedicados para eliminar elementos y reasignar memoria:Array#splice()
yArray#pop
.Array # splice (start [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
muta la matriz y devuelve los índices eliminados.deleteCount
los elementos se eliminan del índicestart
yitem1, item2... itemN
se insertan en la matriz del índicestart
. SideleteCount
se omite, los elementos de startIndex se eliminan al final de la matriz.También hay un nombre similar, pero diferente, la función de
Array.prototype
:Array#slice
.Array # slice ([comienzo [, fin]])
Array#slice
no es destructivo y devuelve una nueva matriz que contiene los índices indicados destart
aend
. Si noend
se especifica, el valor predeterminado es el final de la matriz. Siend
es positivo, especifica el índice no inclusivo basado en cero para detenerse. Siend
es negativo, especifica el índice para detenerse contando desde el final de la matriz (por ejemplo, -1 omitirá el índice final). Siend <= start
, el resultado es una matriz vacía.Array # pop
Array#pop
elimina el último elemento de una matriz y devuelve ese elemento. Esta operación cambia la longitud de la matriz.fuente
delete
y hacer una función de Recolección de Basura para limpiarlo.splice
en su edición, peroremove
debería serArray.prototype.remove = function(index) { this.splice(index, 1); };
Vieja pregunta, respuesta moderna. Usando la desestructuración de objetos, una característica de ECMAScript 6 , es tan simple como:
O con la muestra de preguntas:
Puedes verlo en acción en el editor de prueba de Babel.
Editar:
Para reasignar a la misma variable, use a
let
:fuente
regex
también se puede asignar a cualquier otra variable, por ejemplo_
, lo que se utiliza en lenguajes como Go para descartar un resultado:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
pero no es así, así que no creo que sea posible con la desestructuración.freeze()
losseal()
objetos 'd' y 'd, no puede simplementedelete
una propiedad. Entonces esta es una excelente alternativa. Aunque en la mayoría de los casos, probablemente no tenga sentido eliminar una propiedad de un objeto congelado / sellado de todos modos, teniendo en cuenta que el objetivo es hacer ciertas garantías sobre sus estructuras de datos, de las cuales este patrón estaría socavando. Para aquellos casos en los que necesita duplicar un objeto de forma no destructiva pero sin algunas de sus propiedades, esto es perfectoSintaxis extendida (ES6)
A quien lo necesite ...
Para completar la respuesta @Koen en este hilo, en caso de que desee eliminar la variable dinámica utilizando la sintaxis de propagación, puede hacerlo así:
*
foo
será una nueva variable con el valor dea
(que es 1).RESPUESTA EXTENDIDA 😇
Hay pocas formas comunes de eliminar una propiedad de un objeto.
Cada uno tiene sus propios pros y contras ( consulte esta comparación de rendimiento ):
Eliminar Operador
Legible y breve, sin embargo, puede que no sea la mejor opción si está operando en una gran cantidad de objetos ya que su rendimiento no está optimizado.
Reasignación
Más de 2 veces más rápido que
delete
, sin embargo, la propiedadno seelimina y puede iterarse.Operador de propagación
Este
ES6
operador nos permite devolver un objeto nuevo, excluyendo cualquier propiedad, sin mutar el objeto existente. La desventaja es que tiene el peor rendimiento de lo anterior y no se sugiere su uso cuando necesita eliminar muchas propiedades a la vez.fuente
Otra alternativa es usar la biblioteca Underscore.js .
Tenga en cuenta que
_.pick()
y_.omit()
ambos devuelven una copia del objeto y no modifican directamente el objeto original. Asignar el resultado al objeto original debería hacer el truco (no se muestra).Referencia: enlace _.pick (objeto, * teclas)
Devuelve una copia del objeto, filtrada para que solo tenga valores para las claves incluidas en la lista blanca (o conjunto de claves válidas).
Referencia: link _.omit (objeto, * teclas)
Devuelve una copia del objeto, filtrada para omitir las claves incluidas en la lista negra (o conjunto de claves).
Para matrices,
_.filter()
y_.reject()
se pueden usar de manera similar.fuente
_.omit(collection, key.toString())
delete obj[prop]
que es ~ 100 veces más lento queobj[prop] = undefined
.El término que ha utilizado en el título de su pregunta
Remove a property from a JavaScript object
puede interpretarse de diferentes maneras. El primero es eliminarlo de la memoria completa y la lista de claves de objeto o el otro es simplemente eliminarlo de su objeto. Como se ha mencionado en algunas otras respuestas, ladelete
palabra clave es la parte principal. Digamos que tienes tu objeto como:Si lo haces:
el resultado sería:
Puede eliminar esa clave específica de sus claves de objeto como:
Entonces su clave de objetos usando
Object.keys(myJSONObject)
sería:Pero el punto es que si le importa la memoria y desea completar la eliminación del objeto de la memoria, se recomienda configurarlo como nulo antes de eliminar la clave:
El otro punto importante aquí es tener cuidado con sus otras referencias al mismo objeto. Por ejemplo, si crea una variable como:
O agréguelo como un nuevo puntero a otro objeto como:
Luego, incluso si lo elimina de su objeto
myJSONObject
, ese objeto específico no se eliminará de la memoria, ya que laregex
variable ymyOtherObject["regex"]
todavía tienen sus valores. Entonces, ¿cómo podríamos eliminar el objeto de la memoria con seguridad?La respuesta sería eliminar todas las referencias que tiene en su código, apuntado a ese mismo objeto y también no usar
var
declaraciones para crear nuevas referencias a ese objeto . Este último punto con respecto a lasvar
declaraciones, es uno de los problemas más cruciales que generalmente enfrentamos, porque el uso devar
declaraciones evitaría que el objeto creado se elimine.Lo que significa que en este caso no podrá eliminar ese objeto porque ha creado la
regex
variable a través de unavar
declaración, y si lo hace:El resultado sería
false
, lo que significa que su declaración de eliminación no se ha ejecutado como esperaba. Pero si no había creado esa variable antes, y solo teníamyOtherObject["regex"]
su última referencia existente, podría haberlo hecho simplemente eliminándola como:En otras palabras, un objeto JavaScript se elimina tan pronto como no quede ninguna referencia en su código que apunte a ese objeto.
Actualización: Gracias a @AgentME:
Para obtener más información sobre
Object.seal
: Object.seal ()fuente
myJSONObject.regex
el valor es una cadena y lo asignas a otro objeto, el otro objeto tiene una copia de este valor.ECMAScript 2015 (o ES6) vino con un objeto Reflect incorporado . Es posible eliminar la propiedad del objeto llamando a la función Reflect.deleteProperty () con el objeto de destino y la clave de propiedad como parámetros:
que es equivalente a:
Pero si la propiedad del objeto no es configurable, no se puede eliminar ni con la función deleteProperty ni con el operador delete:
Object.freeze () hace que todas las propiedades del objeto no sean configurables (además de otras cosas).
deleteProperty
La función (así como el operador de eliminación ) vuelvefalse
cuando intenta eliminar cualquiera de sus propiedades. Si la propiedad es configurable, regresatrue
, incluso si la propiedad no existe.La diferencia entre
delete
ydeleteProperty
es cuando se usa el modo estricto:fuente
apply
,call
,bind
funciones ...Supongamos que tiene un objeto que se ve así:
Eliminar una propiedad de objeto
Si desea utilizar toda la
staff
matriz, la forma correcta de hacerlo sería hacerlo:Alternativamente, también puedes hacer esto:
Del mismo modo, la eliminación de toda la matriz de estudiantes se haría llamando a
delete Hogwarts.students;
odelete Hogwarts['students'];
.Eliminar un índice de matriz
Ahora, si desea eliminar a un solo miembro del personal o estudiante, el procedimiento es un poco diferente, porque ambas propiedades son matrices en sí mismas.
Si conoce el índice de su miembro del personal, simplemente puede hacer esto:
Si no conoce el índice, también tendrá que hacer una búsqueda de índice:
Nota
Si bien técnicamente puede usarlo
delete
para una matriz, usarlo daría como resultado resultados incorrectos al llamar, por ejemplo,Hogwarts.staff.length
más adelante. En otras palabras,delete
eliminaría el elemento, pero no actualizaría el valor de lalength
propiedad. Utilizandodelete
también arruinaría tu indexación.Por lo tanto, al eliminar valores de un objeto, siempre considere primero si se trata de propiedades de objeto o si se trata de valores de matriz, y elija la estrategia adecuada en función de eso.
Si quieres experimentar con esto, puedes usar este Fiddle como punto de partida.
fuente
splice
en una matriz en lugar dedelete
.delete
ni siquiera debería ser una cosa. Essplice
lo que estaba buscando el OP.delete
debería usarse para las propiedades del objeto ysplice
para los elementos de la matriz.delete
en matrices, sería mejor no crear código centrado en absoluto.Usando ES6:
(Desestructuración + Operador de propagación)
fuente
Personalmente uso Underscore.js o Lodash para la manipulación de objetos y matrices:
fuente
El operador de eliminación es la mejor manera de hacerlo.
Un ejemplo en vivo para mostrar:
fuente
delete
operador es saludable con respecto a la recolección de basura , puede ser inesperadamente lento , en gran parte por la misma razón.Para clonar objeto sin propiedad:
Por ejemplo:
Y necesitamos eliminar 'a'.
1.Con clave de apoyo explícita:
2.Con clave de apoyo variable:
3.Función de flecha fría 😎:
4. Para múltiples propiedades
Uso
O
fuente
El uso del método delete es la mejor manera de hacerlo, según la descripción de MDN, el operador delete elimina una propiedad de un objeto. Entonces simplemente puedes escribir:
El siguiente fragmento da otro ejemplo simple:
Para obtener más información y ver más ejemplos, visite el siguiente enlace:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
fuente
Otra solución, usando
Array#reduce
.Sin embargo, mutará el objeto original. Si desea crear un nuevo objeto sin la clave especificada, simplemente asigne la función de reducción a una nueva variable, por ejemplo:
(ES6)
fuente
Esta publicación es muy antigua y me resulta muy útil, así que decidí compartir la función sin configurar que escribí en caso de que alguien más vea esta publicación y piense por qué no es tan simple como en la función sin configurar de PHP.
La razón para escribir esta nueva
unset
función es mantener el índice de todas las demás variables en este hash_map. Mire el siguiente ejemplo y vea cómo el índice de "test2" no cambió después de eliminar un valor de hash_map.fuente
Hay muchas buenas respuestas aquí, pero solo quiero decir que cuando use eliminar para eliminar una propiedad en JavaScript, a menudo es aconsejable verificar primero si esa propiedad existe para evitar errores.
P.ej
Debido a la naturaleza dinámica de JavaScript, a menudo hay casos en los que simplemente no sabe si la propiedad existe o no. Comprobar si existe obj antes de && también asegura que no arroje un error debido a llamar a la función hasOwnProperty () en un objeto indefinido.
Lo siento si esto no se agregó a su caso de uso específico, pero creo que este es un buen diseño para adaptarse al administrar objetos y sus propiedades.
fuente
delete foo.bar;
solo genera una excepción si foo es falso o si está en modo estricto y foo es un objeto con una propiedad de barra no configurable.Usando ramda # dissoc obtendrás un nuevo objeto sin el atributo
regex
:También puede usar otras funciones para lograr el mismo efecto: omitir, seleccionar, ...
fuente
Prueba el siguiente método. Asignar el
Object
valor de la propiedad aundefined
. Entoncesstringify
el objeto yparse
.fuente
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Si desea eliminar una propiedad profundamente anidada en el objeto, puede usar la siguiente función recursiva con la ruta a la propiedad como segundo argumento:
Ejemplo:
fuente
Simplemente puede eliminar cualquier propiedad de un objeto usando la
delete
palabra clave.Por ejemplo:
Para eliminar cualquier propiedad, por ejemplo
key1
, use ladelete
palabra clave como esta:O también puede usar la notación tipo matriz:
Ref: MDN .
fuente
Object.assign () y Object.keys () y Array.map ()
fuente
La afirmación de Dan de que "eliminar" es muy lenta y se cuestionó el punto de referencia que publicó. Así que realicé la prueba yo mismo en Chrome 59. Parece que 'eliminar' es aproximadamente 30 veces más lento:
Tenga en cuenta que a propósito realicé más de una operación de 'eliminación' en un ciclo de ciclo para minimizar el efecto causado por las otras operaciones.
fuente
Considere crear un nuevo objeto sin la
"regex"
propiedad porque otras partes de su programa siempre pueden hacer referencia al objeto original. Por lo tanto, debe evitar manipularlo.fuente
SyntaxError: Unexpected token '...'. Expected a property name.
?Eliminación de propiedades en JavaScript
Hay muchas opciones diferentes presentadas en esta página, no porque la mayoría de las opciones sean incorrectas o porque las respuestas sean duplicadas, sino porque la técnica adecuada depende de la situación en la que se encuentre y de los objetivos de las tareas que usted o usted El equipo está tratando de cumplir. Para responder su pregunta inequívocamente, uno necesita saber:
Una vez que se hayan respondido esas cuatro consultas, hay esencialmente cuatro categorías de "eliminación de propiedades" en JavaScript para elegir para cumplir sus objetivos. Son:
Eliminación de propiedad de objeto mutante, insegura
Esta categoría es para operar en literales de objeto o instancias de objeto cuando desea conservar / continuar utilizando la referencia original y no está utilizando principios funcionales sin estado en su código. Un ejemplo de sintaxis en esta categoría:
Esta categoría es la categoría más antigua, más directa y más ampliamente admitida de eliminación de propiedades. Admite
Symbol
índices de matriz además de cadenas y funciona en todas las versiones de JavaScript, excepto en la primera versión. Sin embargo, es mutante, lo que viola algunos principios de programación y tiene implicaciones de rendimiento. También puede generar excepciones no detectadas cuando se usa en propiedades no configurables en modo estricto .Omisión de propiedad de cadena basada en descanso
Esta categoría es para operar en objetos simples o instancias de matriz en nuevos sabores ECMAScript cuando se desea un enfoque no mutativo y no es necesario tener en cuenta las teclas de símbolos:
Eliminación de propiedad de objeto mutante, segura
Esta categoría es para operar en literales de objeto o instancias de objeto cuando desea retener / continuar usando la referencia original mientras protege contra las excepciones que se generan en propiedades no configurables:
Además, aunque la mutación de objetos en el lugar no es apátrida, puede usar la naturaleza funcional de
Reflect.deleteProperty
hacer una aplicación parcial y otras técnicas funcionales que no son posibles con lasdelete
declaraciones.Omisión de propiedad de cadena basada en sintaxis
Esta categoría es para operar en objetos simples o instancias de matriz en nuevos sabores ECMAScript cuando se desea un enfoque no mutativo y no es necesario tener en cuenta las teclas de símbolos:
Omisión de propiedad basada en la biblioteca
Esta categoría generalmente permite una mayor flexibilidad funcional, incluida la contabilidad de símbolos y la omisión de más de una propiedad en una declaración:
fuente
fuente
delete myObject.regex;
.Puede utilizar la desestructuración ES6 con el operador de reposo.
Las propiedades se pueden eliminar mediante la desestructuración en combinación con el operador de descanso . En su ejemplo, la expresión regular se desestructura (se ignora) y el resto de las propiedades se devuelven como descanso.
O puede excluir dinámicamente propiedades como esta,
fuente
Podemos eliminar cualquier propiedad de un objeto javascript usando lo siguiente:
ejemplo:
fuente
Prueba esto
fuente