¿Cuál es la diferencia entre usar el delete
operador en el elemento de matriz en lugar de usar el Array.splice
método ?
Por ejemplo:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
¿Por qué incluso tener el método de empalme si puedo eliminar elementos de matriz como puedo con los objetos?
javascript
arrays
array-splice
delete-operator
lYriCAlsSH
fuente
fuente
.splice
bucles, eche un vistazo a esta pregunta: Eliminar de la matriz en javascript .delete
yArray.prototype.splice
.Respuestas:
delete
eliminará la propiedad del objeto, pero no reindexará la matriz ni actualizará su longitud. Esto hace que parezca que no está definido:Tenga en cuenta que, de hecho, no está establecido en el valor
undefined
, sino que la propiedad se elimina de la matriz, lo que hace que parezca indefinido. Las herramientas de desarrollo de Chrome aclaran esta distinción al imprimirempty
al iniciar la matriz.myArray.splice(start, deleteCount)
en realidad elimina el elemento, reindexa la matriz y cambia su longitud.fuente
delete
hace retirar el elemento, pero no indexar la matriz o actualizar su longitud (que ya está implícita por el anterior ya que la longitud es siempre el más alto índice + 1).delete myArray[0]
sintaxis que dice " Esperaba un operador y en su lugar vio 'eliminar' " .splice
Se recomienda usar .delete myArray[0]
ymyArray[0] = undefined
. En el primer caso, la propiedad se elimina del objeto de matriz por completo. En el segundo caso, la propiedad permanece con el valorundefined
.empty
lugar deundefined
mejorar la distinción entre un elemento de matriz realmente eliminado (o no inicializado) frente a un elemento que tiene el valor real deundefined
. Tenga en cuenta que cuando digo esto quiero decir que solo se muestra comoempty
, y no se refiere a un valor real llamadoempty
(que no existe).Método Array.remove ()
John Resig , creador de jQuery creó un
Array.remove
método muy útil que siempre lo uso en mis proyectos.y aquí hay algunos ejemplos de cómo podría usarse:
El sitio web de John
fuente
[1,2,3].slice('1'); // =[2,3]
), por lo que es más seguro cambiarlo avar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
, luego devuelve el valor que devolviófor(var i in array)
ciclo. Lo eliminé y usé empalme en su lugar.Debido a que eliminar solo elimina el objeto del elemento en la matriz, la longitud de la matriz no cambiará. Splice elimina el objeto y acorta la matriz.
El siguiente código mostrará "a", "b", "indefinido", "d"
Mientras que esto mostrará "a", "b", "d"
fuente
myArray.splice(2,1)
Me topé con esta pregunta al tratar de entender cómo eliminar cada aparición de un elemento de una matriz. Aquí hay una comparación de
splice
ydelete
para eliminar cada uno'c'
de laitems
matriz.fuente
Desde Core JavaScript 1.5 Referencia> Operadores> Operadores especiales> eliminar Operador :
fuente
splice
funcionará con índices numéricos.mientras que
delete
se puede usar contra otro tipo de índices.ejemplo:
fuente
Probablemente también valga la pena mencionar que el empalme solo funciona en matrices. (No se puede confiar en que las propiedades de los objetos sigan un orden coherente).
Para eliminar el par clave-valor de un objeto, eliminar es realmente lo que desea:
fuente
eliminar Vs splice
cuando eliminas un elemento de una matriz
cuando empalmes
en caso de eliminar, el elemento se elimina pero el índice permanece vacío
mientras que en caso de que el elemento de empalme se elimine y el índice de elementos de descanso se reduzca en consecuencia
fuente
Como se indicó muchas veces anteriormente, el uso
splice()
parece un ajuste perfecto. Documentación en Mozilla:fuente
delete actúa como una situación del mundo no real, solo elimina el elemento, pero la longitud de la matriz permanece igual:
ejemplo de terminal de nodo:
Aquí hay una función para eliminar un elemento de una matriz por índice, usando slice () , toma el arr como el primer argumento y el índice del miembro que desea eliminar como el segundo argumento. Como puede ver, en realidad elimina el miembro de la matriz y reducirá la longitud de la matriz en 1
Lo que hace la función anterior es llevar todos los miembros al índice, y todos los miembros después del índice, y los concatena juntos, y devuelve el resultado.
Aquí hay un ejemplo usando la función anterior como un módulo de nodo, ver el terminal será útil:
tenga en cuenta que esto no funcionará en una matriz con duplicados, porque indexOf ("c") solo obtendrá la primera aparición, y solo empalmará y eliminará la primera "c" que encuentre.
fuente
Si desea iterar una matriz grande y eliminar elementos de forma selectiva, sería costoso llamar a splice () para cada eliminación porque splice () tendría que volver a indexar los elementos posteriores cada vez. Debido a que las matrices son asociativas en Javascript, sería más eficiente eliminar los elementos individuales y luego volver a indexar la matriz.
Puedes hacerlo construyendo una nueva matriz. p.ej
Pero no creo que pueda modificar los valores clave en la matriz original, lo que sería más eficiente: parece que tendrá que crear una nueva matriz.
Tenga en cuenta que no necesita verificar las entradas "indefinidas" ya que en realidad no existen y el bucle for no las devuelve. Es un artefacto de la impresión de matriz que los muestra como indefinidos. No parecen existir en la memoria.
Sería bueno si pudieras usar algo como slice () que sería más rápido, pero no se vuelve a indexar. Alguien sabe de una mejor manera?
En realidad, probablemente pueda hacerlo en el lugar de la siguiente manera, que probablemente sea más eficiente, en términos de rendimiento:
fuente
puedes usar algo como esto
fuente
slice
si proviene de un entorno funcional (aunque probablemente menos eficiente).¿Por qué no solo filtrar? Creo que es la forma más clara de considerar las matrices en js.
fuente
delete
nislice
a mí.La diferencia se puede ver registrando la longitud de cada matriz después de aplicar el
delete
operador y elsplice()
método. Por ejemplo:eliminar operador
El
delete
operador elimina el elemento de la matriz, pero el "marcador de posición" del elemento todavía existe.oak
se ha eliminado pero todavía ocupa espacio en la matriz. Debido a esto, la longitud de la matriz sigue siendo 5.método de empalme ()
El
splice()
método elimina completamente el valor objetivo y el "marcador de posición" también.oak
se ha eliminado, así como el espacio que solía ocupar en la matriz. La longitud de la matriz es ahora 4.fuente
ejemplo:
el plátano se elimina y la longitud de la matriz = 2
fuente
Son cosas diferentes que tienen propósitos diferentes.
splice
es específico de la matriz y, cuando se usa para eliminar, elimina las entradas de la matriz y mueve todas las entradas anteriores para llenar el vacío. (También se puede usar para insertar entradas, o ambas al mismo tiempo).splice
Cambiarálength
la matriz (suponiendo que no sea una llamada no operativa:)theArray.splice(x, 0)
.delete
no es específico de la matriz; Está diseñado para su uso en objetos: elimina una propiedad (par clave / valor) del objeto en el que lo usa. Solo se aplica a las matrices porque las matrices estándar (por ejemplo, no tipificadas) en JavaScript no son realmente matrices en absoluto *, son objetos con un manejo especial para ciertas propiedades, como aquellas cuyos nombres son "índices de matriz" (que son definido como nombres de cadena "... cuyo valor numéricoi
está en el rango+0 ≤ i < 2^32-1
") ylength
. Cuando usadelete
para eliminar una entrada de matriz, todo lo que hace es eliminar la entrada; no mueve otras entradas a continuación para llenar el espacio, por lo que la matriz se vuelve "dispersa" (faltan algunas entradas por completo). No tiene ningún efecto sobrelength
.Un par de las respuestas actuales a esta pregunta indican incorrectamente que el uso de
delete
"establece la entrada enundefined
". Eso no es correcto Se elimina la entrada (propiedad) por completo, dejando un hueco.Usemos un código para ilustrar las diferencias:
* (esa es una publicación en mi pequeño blog anémico)
fuente
Actualmente hay dos formas de hacer esto
usando splice ()
arrayObject.splice(index, 1);
usando eliminar
delete arrayObject[index];
Pero siempre sugiero usar el empalme para objetos de matriz y eliminar para atributos de objeto porque eliminar no actualiza la longitud de la matriz.
fuente
OK, imagina que tenemos esta matriz a continuación:
Hagamos eliminar primero:
Y este es el resultado:
¡vacío! y vamos a obtenerlo:
Entonces significa solo el valor eliminado y no está definido ahora, por lo que la longitud es la misma, también devolverá verdadero ...
Vamos a restablecer nuestra matriz y hacerlo con empalme esta vez:
y este es el resultado esta vez:
Como puede ver, la longitud de la matriz cambió y ahora
arr[1]
es 3 ...Además, esto devolverá el elemento eliminado en una matriz que es
[3]
en este caso ...fuente
Otros ya han comparado adecuadamente
delete
consplice
.Otra comparación interesante es
delete
versusundefined
: un elemento de matriz eliminado usa menos memoria que uno que solo está configurado enundefined
;Por ejemplo, este código no terminará:
Produce este error:
Entonces, como puede ver, en
undefined
realidad ocupa memoria de montón.Sin embargo, si también
delete
usa el elemento ary (en lugar de simplemente configurarloundefined
), el código terminará lentamente:Estos son ejemplos extremos, pero señalan
delete
que no he visto a nadie mencionar en ningún lado.fuente
Si tiene una matriz pequeña, puede usar
filter
:fuente
La forma más fácil es probablemente
Espero que esto ayude. Referencia: https://lodash.com/docs#compact
fuente
compact
... no hay necesidad de lodash. TratemyArray.filter(function(n){return n;})
Para aquellos que quieran usar Lodash pueden usar:
myArray = _.without(myArray, itemToRemove)
O como yo uso en Angular2
fuente
Eliminar elemento del último
Eliminar elemento del primero
Eliminar del medio
Eliminar un elemento del último
Eliminar utilizando el número de índice de la matriz
fuente
Si el elemento deseado para eliminar está en el medio (digamos que queremos eliminar 'c', cuyo índice es 1), puede usar:
fuente
IndexOf
acepta también un tipo de referencia. Supongamos el siguiente escenario:Diferentemente:
fuente
// resultado: myArray = ['b', 'c', 'd'];
fuente