Pregunta ¿Cómo puedo vaciar una matriz en JavaScript?


¿Hay alguna manera de vaciar una matriz y, si es posible, con .remove()?

Por ejemplo,

A = [1,2,3,4];

¿Cómo puedo vaciar eso?


2199
2017-08-05 09:08


origen


Respuestas:


Formas de borrar una matriz existente A:

Método 1

(esta fue mi respuesta original a la pregunta)

A = [];

Este código establecerá la variable A a una nueva matriz vacía Esto es perfecto si no tienes referencias a la matriz original A en cualquier otro lugar porque esto realmente crea una matriz nueva (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 original A.

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:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

Método 2 (como sugirió por Matthew Crumley)

A.length = 0

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 "modo estricto" en ECMAScript 5 porque la propiedad de longitud de una matriz es una propiedad de lectura / escritura.

Método 3 (como sugirió por Antonio)

A.splice(0,A.length)

Utilizando .splice() funcionará perfectamente, pero desde el .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 en el rendimiento en absoluto.

Método 4 (como sugirió por tanguy_k)

while(A.length > 0) {
    A.pop();
}

Esta solución no es muy sucinta, y también es la solución más lenta, contrariamente a los puntos de referencia anteriores a los que se hace referencia en la respuesta original.

Actuación

De todos los métodos para limpiar 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 esto punto de referencia.

Como se señala por Diadistis en su responder a continuación, los puntos de referencia originales que se utilizaron para determinar el rendimiento de los cuatro métodos descritos anteriormente fueron defectuosos. La referencia original reutilizó la matriz borrada, por lo que la segunda iteración borraba 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 se ha marcado como la respuesta aceptada durante mucho tiempo, incluiré todos los métodos aquí. Si votas a favor de esta respuesta, vota las otras respuestas a las que me he referido también.


3440
2017-08-05 09:10



Si necesita conservar la matriz original porque tiene otras referencias que también deberían actualizarse, puede borrarla sin crear una nueva matriz estableciendo su longitud en cero:

A.length = 0;

2253
2017-08-05 16:29



Aquí la implementación de trabajo más rápida mientras manteniendo la misma matriz ("mudable"):

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI Mapa define clear() por lo que parece lógico tener clear() para Formación también.

O como un Underscore.js mixin:

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

O una función simple:

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

Mecanografiado versión:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

FYI no se puede simplificar a while (array.pop()): las pruebas fallarán

Y las pruebas que lo acompañan:

describe('Array', () => {
  it('should clear the array', () => {
    let array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

Aquí el jsPerf actualizado: http://jsperf.com/array-destroy/32  http://jsperf.com/array-destroy/152


255
2018-06-25 20:32



Una solución más amigable y más óptima para los navegadores cruzados será usar el splice método para vaciar el contenido de la matriz A de la siguiente manera:

A.splice(0, A.length);


182
2017-11-15 09:49



Las respuestas que tienen no menos de 2739 votos positivos hasta ahora son engañosas e incorrectas.

La pregunta es: "¿Cómo se vacía su matriz existente?" P.ej. para A = [1,2,3,4].

  1. Diciendo "A = [] es la respuesta "es ignorante y absolutamente incorrecta. [] == [] es falso.

    Esto se debe a que estas dos matrices son dos objetos individuales separados, con sus dos identidades, ocupando su propio espacio en el mundo digital, cada uno por su cuenta.


Digamos que su madre le pide que vacíe la papelera.

  • No traes uno nuevo como si hubieras hecho lo que te pidieron.
  • En cambio, vacias la papelera.
  • No reemplaza la llena con una nueva lata vacía, y no toma la etiqueta "A" de la lata llena y la pega a la nueva como en A = [1,2,3,4]; A = [];

Vaciar un objeto de matriz es lo más fácil:

A.length = 0;

¡De esta manera, la lata debajo de "A" no solo está vacía, sino también tan limpia como nueva!


  1. Además, no es necesario que retire la basura a mano hasta que la lata esté vacía. Se le pidió que vacíe la existente, completamente, en un turno, no para recoger la basura hasta que la lata se vacíe, como en:

    while(A.length > 0) {
        A.pop();
    }
    
  2. Tampoco, para poner su mano izquierda en el fondo de la basura, sosteniéndola con la derecha en la parte superior para poder sacar su contenido como en:

    A.splice(0, A.length);
    

No, se te pidió que lo vaciases:

A.length = 0;

Este es el único código que vacía correctamente el contenido de una matriz de JavaScript determinada.


61
2018-04-30 15:18



Prueba de rendimiento:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

59
2018-05-14 07:14



Puede agregar esto a su archivo JavaScript para permitir que sus matrices se "borren":

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

Entonces puedes usarlo así:

var list = [1, 2, 3];
list.clear();

O si quiere estar seguro de que no destruye algo:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

Mucha gente piensa que no deberías modificar objetos nativos (como Array), y estoy dispuesto a estar de acuerdo. Tenga cuidado al decidir cómo manejar esto.


32
2017-12-11 02:58