¿Cómo vacío una matriz en JavaScript?

2197

¿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?

akano1
fuente
1
Aquí un punto de referencia con diferentes posibilidades: jsben.ch/#/7QyI1
EscapeNetscape

Respuestas:

4415

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 Aen 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 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 sugerido por Mateo 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 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 )

A.splice(0,A.length)

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 )

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

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.

Philippe Leybaert
fuente
184
while (A.length) { A.pop(); }, no hay necesidad de> 0
Ivan Black
327
> 0es más legible en mi humilde opinión. Y no hay diferencia de rendimiento entre los dos.
Philippe Leybaert
10
@daghan, no está nada claro lo que estás tratando de decir. bcontiene una referencia a la matriz anterior incluso después de que ase le asigne una nueva. cy dcontinúe haciendo referencia a la misma matriz. Por lo tanto, se espera la diferencia en las salidas.
shovavnik
99
@DiegoJancic Método # 1 no cuenta porque no borra la matriz. Crea uno nuevo. No debe incluirse en un punto de referencia.
Philippe Leybaert, el
44
No se puede usar 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]. Incluso while(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ó.
Jonathan Gawrych
2461

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:

A.length = 0;
Matthew Crumley
fuente
18
¿Qué dice el estándar ECMAScript 5 sobre esto?
Pacerier
213
@Pacerier: todavía funciona en ES5. De la sección 15.4: "... cada vez que se cambia la propiedad de longitud, cada propiedad cuyo nombre es un índice de matriz cuyo valor no es menor que la nueva longitud se elimina automáticamente"
Matthew Crumley
2
@einar: las matrices de JavaScript siempre se expanden para ajustarse a lo que pones en ellas, por lo que cuando lo llamas myarray.push(whatever)agrega uno a la longitud. Por lo tanto, establecer la longitud trunca la matriz, pero no es permanente.
Matthew Crumley,
12
@LosManos Incluso en modo estricto, lengthes una propiedad especial, pero no solo de lectura, por lo que seguirá funcionando.
Matthew Crumley el
11
@MattewCrumley Hice algunas pruebas, y parece que a.length = 0 no es para limpiar eficientemente toda la matriz. jsperf.com/length-equal-0-or-new-array Creo que si tiene una referencia (y no ha agregado propiedades adicionales que desea mantener), es mejor crear una nueva matriz, y dejar la antigua para el recolector de basura, que se ejecutará cuando sea apropiado.
Paul Brewczynski
289

Aquí la ejecución más rápida de trabajo , mientras que manteniendo el mismo array ( "mutable"):

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

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 tener clear()para Array .

Versión de TypeScript:

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

Las pruebas correspondientes:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    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

tanguy_k
fuente
55
TT su respuesta es la única que corrige y es rápida (al mismo tiempo) pero tiene muchos menos "votos positivos". Bueno, parece que a la gente le gustan las soluciones bonitas que son lentas: /
obenjiro
@naomik Pero esta es una de las funcionalidades básicas, que debería haber estado allí por defecto.
thefourtheye
77
@thefourtheye Buena solución para el rendimiento, aunque estoy de acuerdo con @naomik, no debe modificar objetos nativos. Decir que debería estar allí no viene al caso, el problema es que estás modificando los globales , lo cual es malo. Si está proporcionando su código para que otros lo usen, entonces no debería tener efectos secundarios imprevistos. Imagínese si otra biblioteca también modificara el Array.prototypey 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.
jpillora
3
@thefourtheye El objetivo de no modificar el alcance global es porque no sabrá si el código de otra persona ya está (o lo estará) usando el nombre. Sugiero una función dentro del ámbito local. Entonces, dentro del IIFE de su aplicación / biblioteca , haga function clear(arr) { while(arr.length) arr.pop(); }, luego borre las matrices con en clear(arr)lugar de arr.clear().
jpillora
2
Resulta que este método es mucho más lento que .splice()y .length=0. Los puntos de referencia no fueron correctos. Ver mi respuesta actualizada.
Philippe Leybaert
216

Una solución más optimizada y optimizada para varios navegadores será utilizar el splicemétodo para vaciar el contenido de la matriz A como se muestra a continuación:

A.splice(0, A.length);

Antonio
fuente
49
¿Por qué es más amigable para todos los navegadores? ¿Qué navegadores tienen problemas con A.length?
stricjux
44
@ jm2 lo que estás diciendo no es del todo cierto. Realmente modifica la matriz en cuestión y posteriormente todas las referencias se ven afectadas. Vea la prueba en mi jsFiddle: jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya
3
@alex no, no lo hace, splicemodifica la matriz y devuelve las entradas eliminadas. Lea primero los documentos: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
David Hellsing
3
Podríamos evitar que la matriz resultante sea devuelta mediante el operador coma : A.splice(0, A.length),0;. Esto dejaría un valor de retorno 0igual que lo A.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 la splicecual sería más rápido que la configuración length.
Evan Kennedy
8
También he encontrado que A.splice(0)también funciona.
corwin.amber
97

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].

  1. 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.

  • No traes uno nuevo como si hubieras hecho lo que te pidieron.
  • En cambio, vacias el bote de basura.
  • 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 vaciara la existente, completamente, en un turno, que no recogiera 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 extraer su contenido como en:

    A.splice(0, A.length);

No, te pidieron que lo vaciases:

A.length = 0;

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

Bekim Bacaj
fuente
11
El único problema con su solución sugerida es que la basura aún existe, es solo que cambió el tablón de anuncios diciendo que no hay basura. Todavía debe existir una referencia a la matriz anterior. ¿Puede estar seguro de que el recolector de basura al establecer .length = 0, también eliminará todas las referencias a la matriz y sus propiedades? Sin embargo, creo que sí, pero para mí eso es mágico. Un método .clear () es deseable para evitar confusión por decir lo menos.
mmm
8
Nunca dije que esta solución es incorrecta. El problema es que todo este hilo es completamente innecesario. Más de 3000 votos muestran que tratar de descubrir cuál es la mejor manera debería hacer que sea un caso lo suficientemente válido para que los desarrolladores de crack de EMCA agreguen dicho método. Nadie debería tener que resolverlo. Hay tres o cuatro formas diferentes de hacerlo. En algunos puntos de referencia, las soluciones de longitud son mucho más lentas que otras. Además, la idea de establecer .length = 0, para cualquier desarrollador razonable no sería satisfactoria.
mmm
2
Porque para lograr lo que debería, todas las referencias deben eliminarse. .length = 0 ni siquiera es una llamada al método, por lo que si hay otras acciones tomadas cuando se establece en 0 (que hay en la mayoría de los navegadores a través de definir setter), aún consideraría demasiado mágico confiar en que realmente haga lo que supuso que hacer.
mmm
77
Por lo tanto, prefiero aclararlo yo mismo. Un método claro puede ser prototipo, pero eso es simplemente feo. Mi punto es que esta implementación ya debería estar presente para que más de 10 000 desarrolladores no tuvieran que pasar horas leyendo solo este hilo, sin considerar a todos los demás que dedicaron más tiempo a la evaluación comparativa.
mmm
1
solo hay una forma de vaciar su matriz, llenarla con nuevos datos entrantes y descartarla nuevamente. Todos los demás no lo son, o son ridículamente ineficientes e imperdonablemente hambrientos de CPU. La única alternativa práctica es A(n) = A.splice( 0, A.length );en caso de que necesite hacer una copia de seguridad de su contenido anterior. ps Array.lengthes 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.
Bekim Bacaj
63

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
kenshou.html
fuente
99
Agregar los cambios porcentuales no es muy útil sin tener en cuenta también su plataforma. En mi máquina, el pop solo es ligeramente más rápido en Chrome 34, pero en realidad es más lento que [] en el último Firefox.
Matt Styles
2
Probando en Firefox 39.0 de 32 bits en Windows NT 6.3 de 64 bits, ¡a = [] es el más rápido!
Reza-S4
55
Definitivamente hay algo sospechoso en el resultado de esta prueba en Chrome. ¿Cómo demonios puede ser el bucle emergente mucho más rápido que las otras 3 soluciones?
chqrlie
99
@chqrlie No lo es. Es el método más lento. La prueba de referencia es defectuosa.
Philippe Leybaert
15
Elimine esta respuesta porque es incorrecta y se vincula a una prueba defectuosa sin sentido como evidencia falsa.
James Wakefield
35

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 quieres asegurarte de no destruir algo:

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

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.

sanguijuela
fuente
1
@naomik ¿Puedes explicar tu razonamiento por qué hacer algo así está mal visto?
Indefinido el
17
Está "mal visto" modificar funciones primitivas de JavaScript como Array y String. Posiblemente podría estar sobrecargando una función ya existente y eliminar la clase de objeto. Puede haber un oscuro motor de JavaScript que ya tiene clear () y espera que se comporte de una manera diferente. Pisar con cuidado es todo lo que digo.
Diseño de Adrian
¿Qué tal el problema donde un foreach sobre los miembros de una matriz comenzará repentinamente a incluir una clearclave?
ErikE
19

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:

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}

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 splicees 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).

Diadistis
fuente
Muy buen punto! Actualizaré la respuesta original con los resultados correctos de referencia.
Philippe Leybaert
No puedo creer que nadie haya visto ese error de referencia. Con más de medio millón de visitas, esperarías que alguien lo notara. Gran trabajo Diadistis
Philippe Leybaert
15

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á:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

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.

Matanster
fuente
15

Puede crear fácilmente una función para hacer eso por usted, cambiar la longitud o incluso agregarla a la matriz nativa comoremove() función para su reutilización.

Imagina que tienes esta matriz:

var arr = [1, 2, 3, 4, 5]; //the array

OK, simplemente ejecuta esto:

arr.length = 0; //change the length

y el resultado es:

[] //result

manera fácil de vaciar una matriz ...

También se usa el bucle que no es necesario, pero solo otra forma de hacerlo:

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

También hay formas complicadas en las que puede pensar, por ejemplo, algo como esto:

arr.splice(0, arr.length); //[]

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:

arr = []; //[]

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:

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

y simplemente puede llamarlo así para vaciar cualquier matriz en su aplicación javascript:

arr.remove(); //[]
Alireza
fuente
longitud de arr = 0; // cambia la duración
Ajay Malhotra
14
Array.prototype.clear = function() {
    this.length = 0;
};

Y llámalo: array.clear();

Bendegúz
fuente
77
No aliente la modificación de los objetos nativos.
Gracias
21
¿Por qué las personas tienen esta tendencia a tomar la respuesta aceptada y ponerla en una función prototipo? ¿Realmente haces esto en tus proyectos? ¿Tiene una gran biblioteca de adiciones de prototipos que incluye en cada proyecto?
nurettin
44
¿Por qué no simplemente escribir array.length = 0?
Diseño de Adrian
10
@naomik "Por favor, no aliente la modificación de los objetos nativos". - Estoy completamente de acuerdo con esto, pero solo repetir la oración por sí solo parece arrogante. Alguien que proponga tal solución probablemente no sea consciente de las consecuencias, y dejar caer esta línea sobre ellas en lugar de proporcionar una breve explicación o un enlace no transmite un significado que no sea "nosotros, personas más inteligentes que usted, le decimos que no haga esto, porque sabemos mejor " .
John Weisz
12

A.splice(0);

Acabo de hacer esto en algún código en el que estoy trabajando. Se borró la matriz.

David Campbell
fuente
No, acaba de cambiar un contenedor de matriz con nombre por uno anónimo recién creado. `var A = [1,2,3,4]; var B; B = A. empalme (0); console.log (A); console.log (B); '
Bekim Bacaj
12

Si estas usando

a = []; 

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.

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

o

a.length = 0;

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.

a.splice(0,a.length)

y

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

Según la respuesta anterior de kenshou.html, el segundo método es más rápido.

Laxmikant Dange
fuente
10
Además de estar equivocado a.length, ¿no veo qué agrega esta nueva respuesta al hilo?
Bergi
@Bergi Solo quiero centrarme en la representación de memoria real sobre la matriz
Laxmikant Dange
¿Tiene alguna fuente para confirmar qué motores JS crearán una nueva matriz cuando a.length=0;se realice? ¿Cómo actuarían esos motores a.length=500;y por a.length=4;qué?
joeytwiddle
Lo probé en la mayoría de los navegadores, como IE, Firefox, Chrome, está creando una nueva matriz. Si establece una longitud mayor que 0, creará una matriz con elementos indefinidos, es decir, solo contendrá algunas ubicaciones de memoria.
Laxmikant Dange
1
var a = [1]; var b = a; a.length = 0; console.log(b)imprime Array [ ], por lo que no parece que esté creando una nueva matriz para mí.
John Montgomery
9

Use una versión modificada de la sugerencia inicial de Jan :

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}
cssimsek
fuente
12
¿Por qué querrías hacer tal cosa? ¿Por qué agregar dos variables más y un montón de código para hacer lo mismo?
Killah
6

Si usa constantes, entonces no tiene otra opción:

const numbers = [1, 2, 3]

No puede reasignar:

numbers = []

Solo puedes truncar:

numbers.length = 0
Damjan Pavlica
fuente
5

ingrese la descripción de la imagen aquí

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:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] Cree una matriz con una nueva ubicación de memoria utilizando Array constructoro array literal.

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
  • 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.

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);
Yash
fuente
"longitud: aparece hasta que la longitud de una matriz es del tamaño especificado". ¿Quién te dijo estas tonterías?
Bekim Bacaj
@BekimBacaj En esencia, tiene el mismo efecto. Probablemente debería haber dicho en length = ?lugar de solo length.
Tuupertunut
@BekimBacaj He actualizado mi respuesta, simplemente asumí que la longitud aparece hasta la longitud, pero ahora corregí esa longitud solo se trunca o aumenta el tamaño de una matriz.
Yash
3

Me sorprende que nadie haya sugerido esto todavía:

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

Esto produce una matriz en un estado bastante diferente de las otras soluciones. En cierto sentido, la matriz se ha 'vaciado':

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

Puede producir una matriz equivalente con [,,,,] oArray(4)

Cauterita
fuente
77
Podría ser una buena respuesta a una pregunta diferente: "Cómo convertir todos los elementos de una matriz en elementos indefinidos".
Ruben
Aunque internamente hay una diferencia entre elementos indefinidos y ranuras vacías ("agujeros")
Cauterite
-9

Use a continuación si necesita vaciar Angular 2+ FormArray.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}
Manish Jain
fuente
10
Esto es irrelevante y ni siquiera JavaScript.
Emile Bergeron