¿Hay alguna manera de vaciar una matriz y, si es así, posiblemente con .remove()
?
Por ejemplo,
A = [1,2,3,4];
¿Cómo puedo vaciar eso?
javascript
arrays
akano1
fuente
fuente
Respuestas:
Formas de borrar una matriz existente
A
:Método 1
(esta fue mi respuesta original a la pregunta)
Este código establecerá la variable
A
en una nueva matriz vacía. Esto es perfecto si no tiene referencias a la matriz original enA
ningún otro lugar porque esto realmente crea una nueva matriz (vacía). Debe tener cuidado con este método porque si ha hecho referencia a esta matriz desde otra variable o propiedad, la matriz original permanecerá sin cambios. Solo use esto si solo hace referencia a la matriz por su variable originalA
.Esta es también la solución más rápida.
Este ejemplo de código muestra el problema que puede encontrar al usar este método:
Método 2 (como sugerido por Mateo Crumley )
Esto borrará la matriz existente al establecer su longitud en 0. Algunos han argumentado que esto puede no funcionar en todas las implementaciones de JavaScript, pero resulta que este no es el caso. También funciona cuando se usa el "modo estricto" en ECMAScript 5 porque la propiedad de longitud de una matriz es una propiedad de lectura / escritura.
Método 3 (como sugerido por Anthony )
El uso
.splice()
funcionará perfectamente, pero dado que la.splice()
función devolverá una matriz con todos los elementos eliminados, en realidad devolverá una copia de la matriz original. Los puntos de referencia sugieren que esto no tiene ningún efecto sobre el rendimiento.Método 4 (como sugerido por tanguy_k )
Esta solución no es muy sucinta, y también es la solución más lenta, al contrario de los puntos de referencia anteriores mencionados en la respuesta original.
Actuación
De todos los métodos para borrar una matriz existente , los métodos 2 y 3 son muy similares en rendimiento y son mucho más rápidos que el método 4. Vea este punto de referencia .
Como señaló Diadistis en su respuesta a continuación, los puntos de referencia originales que se utilizaron para determinar el rendimiento de los cuatro métodos descritos anteriormente eran defectuosos. El punto de referencia original reutilizó la matriz borrada, por lo que la segunda iteración borró una matriz que ya estaba vacía.
El siguiente punto de referencia corrige este defecto: http://jsben.ch/#/hyj65 . Muestra claramente que los métodos # 2 (propiedad de longitud) y # 3 (empalme) son los más rápidos (sin contar el método # 1 que no cambia la matriz original).
Este ha sido un tema candente y la causa de mucha controversia. En realidad, hay muchas respuestas correctas y debido a que esta respuesta ha sido marcada como la respuesta aceptada durante mucho tiempo, incluiré todos los métodos aquí. Si vota por esta respuesta, vote también las otras respuestas a las que me he referido.
fuente
while (A.length) { A.pop(); }
, no hay necesidad de> 0
> 0
es más legible en mi humilde opinión. Y no hay diferencia de rendimiento entre los dos.b
contiene una referencia a la matriz anterior incluso después de quea
se le asigne una nueva.c
yd
continúe haciendo referencia a la misma matriz. Por lo tanto, se espera la diferencia en las salidas.while(A.pop())
en caso de que un elemento de la matriz sea falsey. Tomemos, por ejemplo, A = [2, 1, 0, -1, -2] resultaría en A igual a [2, 1]. Inclusowhile(A.pop() !== undefined)
no funciona porque puede tener una matriz con indefinido como uno de los valores. Probablemente por qué el compilador no lo optimizó.Si necesita mantener la matriz original porque tiene otras referencias a ella que también deben actualizarse, puede borrarla sin crear una nueva matriz configurando su longitud en cero:
fuente
myarray.push(whatever)
agrega uno a la longitud. Por lo tanto, establecer la longitud trunca la matriz, pero no es permanente.length
es una propiedad especial, pero no solo de lectura, por lo que seguirá funcionando.Aquí la ejecución más rápida de trabajo, mientras que manteniendo el mismo array ( "mutable"):Para su información, no se puede simplificar
while (array.pop())
: las pruebas fallarán.FYI Map and Set define
clear()
, habría parecido lógico tenerclear()
para Array .Versión de TypeScript:
Las pruebas correspondientes:
Aquí el jsPerf actualizado:
http://jsperf.com/array-destroy/32http://jsperf.com/array-destroy/152fuente
Array.prototype
y estuviera haciendo algo ligeramente diferente, entonces todo su código[].clear()
estaba ligeramente equivocado. Esto no sería divertido de depurar. Entonces, el mensaje general es: No modifique los globales.function clear(arr) { while(arr.length) arr.pop(); }
, luego borre las matrices con enclear(arr)
lugar dearr.clear()
..splice()
y.length=0
. Los puntos de referencia no fueron correctos. Ver mi respuesta actualizada.Una solución más optimizada y optimizada para varios navegadores será utilizar el
splice
método para vaciar el contenido de la matriz A como se muestra a continuación:A.splice(0, A.length);
fuente
splice
modifica la matriz y devuelve las entradas eliminadas. Lea primero los documentos: developer.mozilla.org/en-US/docs/JavaScript/Reference/…A.splice(0, A.length),0;
. Esto dejaría un valor de retorno0
igual que loA.length = 0;
haría. La matriz resultante todavía se crea y debería hacer que el script se ejecute más lentamente: ( jsperf ~ 56% más lento). La implementación del navegador afectará esto, aunque no veo ninguna razón por lasplice
cual sería más rápido que la configuraciónlength
.A.splice(0)
también funciona.Las respuestas que no tienen menos de 2739 votos positivos hasta ahora son engañosas e incorrectas.
La pregunta es: "¿Cómo vaciar su matriz existente?" Por ejemplo para
A = [1,2,3,4]
.Decir "
A = []
es la respuesta" es ignorante y absolutamente incorrecto.[] == []
es falsa .Esto se debe a que estas dos matrices son dos objetos separados e individuales, con sus propias dos identidades, que ocupan su propio espacio en el mundo digital, cada uno por su cuenta.
Digamos que tu madre te pide que vacíes el bote de basura.
A = [1,2,3,4]; A = [];
Vaciar un objeto de matriz es lo más fácil:
De esta manera, la lata debajo de "A" no solo está vacía, ¡sino también tan limpia como nueva!
¡Además, no es necesario que retire la basura a mano hasta que la lata esté vacía! Se le pidió que vaciara la existente, completamente, en un turno, que no recogiera la basura hasta que la lata se vacíe, como en:
Tampoco, para poner su mano izquierda en el fondo de la basura, sosteniéndola con la derecha en la parte superior para poder extraer su contenido como en:
No, te pidieron que lo vaciases:
Este es el único código que vacía correctamente el contenido de una matriz de JavaScript dada.
fuente
A(n) = A.splice( 0, A.length );
en caso de que necesite hacer una copia de seguridad de su contenido anterior. psArray.length
es un método \ propiedad de lectura y escritura en caso de que haya omitido ese hecho básico. Es decir, puede expandirlo a una nueva longitud, no puede recortarlo a la longitud que desee y, entre otros, puede descartar todos los miembros acortando su longitud a 0. Es un cuchillo suizo de la matriz.Prueba de rendimiento:
http://jsperf.com/array-clear-methods/3
fuente
Puede agregar esto a su archivo JavaScript para permitir que sus matrices se "borren":
Entonces puedes usarlo así:
O si quieres asegurarte de no destruir algo:
Mucha gente piensa que no debería modificar objetos nativos (como Array), y estoy dispuesto a aceptar. Tenga cuidado al decidir cómo manejar esto.
fuente
clear
clave?Hay mucha confusión y desinformación con respecto al tiempo; rendimiento de pop / shift tanto en respuestas como en comentarios. La solución while / pop tiene (como se esperaba) el peor rendimiento . Lo que realmente sucede es que la configuración se ejecuta solo una vez para cada muestra que ejecuta el fragmento en un bucle. p.ej:
He creado una nueva prueba que funciona correctamente:
http://jsperf.com/empty-javascript-array-redux
Advertencia: incluso en esta versión de la prueba, no puede ver la diferencia real porque la clonación de la matriz ocupa la mayor parte del tiempo de prueba. Todavía muestra que
splice
es la forma más rápida de borrar la matriz (sin tomar[]
en cuenta porque, aunque es la más rápida, en realidad no está borrando la matriz existente).fuente
En caso de que esté interesado en la asignación de memoria, puede comparar cada enfoque utilizando algo como este jsfiddle junto con la pestaña de línea de tiempo de las herramientas de desarrollo de Chrome. Deberá utilizar el icono de la papelera en la parte inferior para forzar una recolección de basura después de 'limpiar' la matriz. Esto debería darle una respuesta más definitiva para el navegador de su elección. Muchas de las respuestas aquí son viejas y no confiaría en ellas, sino que probaría como en la respuesta de @ tanguy_k anterior.
(para una introducción a la pestaña mencionada anteriormente, puede consultar aquí )
Stackoverflow me obliga a copiar el jsfiddle, así que aquí está:
Y debe tener en cuenta que puede depender del tipo de elementos de la matriz, ya que JavaScript gestiona las cadenas de manera diferente a otros tipos primitivos, sin mencionar las matrices de objetos. El tipo puede afectar lo que sucede.
fuente
Puede crear fácilmente una función para hacer eso por usted, cambiar la longitud o incluso agregarla a la matriz nativa como
remove()
función para su reutilización.Imagina que tienes esta matriz:
OK, simplemente ejecuta esto:
y el resultado es:
manera fácil de vaciar una matriz ...
También se usa el bucle que no es necesario, pero solo otra forma de hacerlo:
También hay formas complicadas en las que puede pensar, por ejemplo, algo como esto:
Entonces, si arr tiene 5 elementos, empalmará 5 elementos de 0, lo que significa que no quedará nada en la matriz.
También otras formas como simplemente reasignar la matriz, por ejemplo:
Si observa las funciones de matriz, hay muchas otras formas de hacerlo, pero la más recomendada podría ser cambiar la longitud.
Como dije en primer lugar, también puedes crear un prototipo de remove (), ya que es la respuesta a tu pregunta. simplemente puede elegir uno de los métodos anteriores y crear un prototipo para el objeto Array en JavaScript, algo así como:
y simplemente puede llamarlo así para vaciar cualquier matriz en su aplicación javascript:
fuente
Y llámalo:
array.clear();
fuente
A.splice(0);
Acabo de hacer esto en algún código en el que estoy trabajando. Se borró la matriz.
fuente
Si estas usando
Luego está asignando una nueva referencia de matriz a a, si la referencia en a ya está asignada a cualquier otra variable, entonces no vaciará esa matriz también y, por lo tanto, el recolector de basura no recopilará esa memoria.
Por ej.
o
Cuando especificamos
a.length
, solo estamos restableciendo los límites de la matriz y la memoria para los elementos de la matriz de descanso se conectará mediante un recolector de basura.En lugar de estas dos soluciones son mejores.
y
Según la respuesta anterior de kenshou.html, el segundo método es más rápido.
fuente
a.length
, ¿no veo qué agrega esta nueva respuesta al hilo?a.length=0;
se realice? ¿Cómo actuarían esos motoresa.length=500;
y pora.length=4;
qué?var a = [1]; var b = a; a.length = 0; console.log(b)
imprimeArray [ ]
, por lo que no parece que esté creando una nueva matriz para mí.Use una versión modificada de la sugerencia inicial de Jan :
fuente
Si usa constantes, entonces no tiene otra opción:
No puede reasignar:
Solo puedes truncar:
fuente
Para vaciar una ubicación de memoria actual de una matriz, use:
'myArray.length = 0'
o'myArray.pop() UN-till its length is 0'
length
: Puede establecer la propiedad de longitud para truncar una matriz en cualquier momento. Cuando extiende una matriz cambiando su propiedad de longitud, aumenta el número de elementos reales.pop()
: El método pop elimina el último elemento de una matriz y devuelve el valor eliminado.shift()
: El método shift elimina el elemento en el índice cero y desplaza los valores en índices consecutivos hacia abajo, luego devuelve el valor eliminado.Ejemplo:
new Array() | []
Cree una matriz con una nueva ubicación de memoria utilizandoArray constructor
oarray literal
.slice()
: Al utilizar la función de división, obtenemos una copia superficial de elementos de la matriz original, con una nueva dirección de memoria, de modo que cualquier modificación en cloneArr no afectará a una matriz original real.fuente
length = ?
lugar de sololength
.Me sorprende que nadie haya sugerido esto todavía:
Esto produce una matriz en un estado bastante diferente de las otras soluciones. En cierto sentido, la matriz se ha 'vaciado':
Puede producir una matriz equivalente con
[,,,,]
oArray(4)
fuente
Use a continuación si necesita vaciar Angular 2+ FormArray.
fuente