Como esvazio uma matriz em JavaScript?

2197

Existe uma maneira de esvaziar uma matriz e, se for o caso, com .remove()?

Por exemplo,

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

Como posso esvaziar isso?

akano1
fonte
1
aqui uma referência com diferentes possibilidades: jsben.ch/#/7QyI1
EscapeNetscape

Respostas:

4415

Maneiras de limpar uma matriz existente A:

Método 1

(esta foi minha resposta original à pergunta)

A = [];

Este código definirá a variável Apara uma nova matriz vazia. Isso é perfeito se você não tiver referências à matriz original emA nenhum outro lugar, porque isso realmente cria uma nova matriz (vazia). Você deve ter cuidado com esse método, porque se você referenciou essa matriz de outra variável ou propriedade, a matriz original permanecerá inalterada. Use isso somente se você fizer referência à matriz por sua variável original A.

Essa também é a solução mais rápida.

Este exemplo de código mostra o problema que você pode encontrar ao 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 (conforme sugerido por Matthew Crumley )

A.length = 0

Isso limpará a matriz existente, definindo seu comprimento como 0. Alguns argumentaram que isso pode não funcionar em todas as implementações de JavaScript, mas acontece que esse não é o caso. Também funciona ao usar o "modo estrito" no ECMAScript 5 porque a propriedade length de uma matriz é uma propriedade de leitura / gravação.

Método 3 (como sugerido por Anthony )

A.splice(0,A.length)

O uso .splice()funcionará perfeitamente, mas como o.splice() função retornará uma matriz com todos os itens removidos, ela realmente retornará uma cópia da matriz original. Os benchmarks sugerem que isso não afeta o desempenho.

Método 4 (conforme sugerido por tanguy_k )

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

Essa solução não é muito sucinta e também é a solução mais lenta, ao contrário dos benchmarks anteriores mencionados na resposta original.

atuação

De todos os métodos de limpeza de uma matriz existente , os métodos 2 e 3 são muito semelhantes no desempenho e são muito mais rápidos que o método 4. Consulte este benchmark .

Como apontado por Diadistis em sua resposta abaixo, os benchmarks originais que foram usados ​​para determinar o desempenho dos quatro métodos descritos acima foram falhos. O benchmark original reutilizou a matriz limpa, portanto a segunda iteração estava limpando uma matriz que já estava vazia.

O seguinte benchmark corrige essa falha: http://jsben.ch/#/hyj65 . Isso mostra claramente que os métodos nº 2 (propriedade length) e nº 3 (emenda) são os mais rápidos (sem contar o método nº 1, que não altera a matriz original).


Este tem sido um tópico quente e a causa de muita controvérsia. Na verdade, existem muitas respostas corretas e, como essa resposta foi marcada como resposta aceita por muito tempo, incluirei todos os métodos aqui. Se você votar nesta resposta, faça um voto positivo nas outras respostas que eu referenciei também.

Philippe Leybaert
fonte
184
while (A.length) { A.pop(); }, não há necessidade de> 0
Ivan Black
327
> 0é IMHO mais legível. E não há diferença de desempenho entre os dois.
Philippe Leybaert 8/08/14
10
@ Daghan, não está nada claro o que você está tentando dizer. bmantém uma referência à matriz antiga mesmo após a aatribuição de uma nova. ce dcontinue a referenciar a mesma matriz. A diferença nas saídas é, portanto, esperada.
shovavnik
9
@DiegoJancic O método 1 não conta porque não limpa a matriz. Cria um novo. Não deve ser incluído em uma referência.
Philippe Leybaert 7/11
44
Você não pode usar while(A.pop())caso um item na matriz seja falsey. Tomemos, por exemplo, A = [2, 1, 0, -1, -2] resultaria em A igual a [2, 1]. Mesmo while(A.pop() !== undefined)não funciona porque você pode ter uma matriz com indefinido como um dos valores. Provavelmente porque o compilador não o otimizou.
Jonathan Gawrych
2461

Se você precisar manter a matriz original porque também possui outras referências que também devem ser atualizadas, limpe-a sem criar uma nova matriz, definindo seu comprimento como zero:

A.length = 0;
Matthew Crumley
fonte
17
o que o ECMAScript 5 Standard diz sobre isso?
Pacerier
212
@ Pacerier: Ainda funciona no ES5. Da seção 15.4: "... sempre que a propriedade length é alterada, todas as propriedades cujo nome é um índice de matriz cujo valor não é menor que o novo comprimento são automaticamente excluídas"
Matthew Crumley
2
@einar: as matrizes JavaScript sempre se expandem para caber no que você colocar nelas, portanto, quando você a chama myarray.push(whatever), adiciona uma ao comprimento. Portanto, definir o comprimento trunca a matriz, mas não é permanente.
Matthew Crumley
12
@LosManos Mesmo no modo estrito, lengthé uma propriedade especial, mas não é somente de leitura, por isso ainda funcionará.
Matthew Crumley
11
@ MattewCrumley eu fiz alguns testes, e parece que a.length = 0 não é eficiente para limpar toda a matriz. jsperf.com/length-equal-0-or-new-array Acho que se você tiver uma referência (e não tiver adicionado propriedades extras que deseja manter), é melhor criar uma nova matriz e deixar antigo para o coletor de lixo, que será executado quando apropriado.
Paul Brewczynski
289

Aqui está a implementação de trabalho mais rápida , mantendo a mesma matriz ("mutável"):

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

Para sua informação, não pode ser simplificado while (array.pop()): os testes falharão.

Mapa e conjunto da FYI define clear(), parece lógico ter clear()para Array .

Versão TypeScript:

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

Os testes correspondentes:

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);
  });
});

Aqui o jsPerf atualizado: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152

tanguy_k
fonte
5
TT, sua resposta é a única que é correta e rápida (ao mesmo tempo), mas tem muito menos "votos positivos". Bem, parece que as pessoas gostam de soluções bonitas que são lentas: /
obenjiro 26/06
@naomik Mas essa é uma das funcionalidades básicas, que deveria estar lá por padrão.
thefourtheye
7
@thefourtheye Boa solução para desempenho, embora eu concorde com o @naomik, você não deve modificar objetos nativos. Dizer que deveria estar lá está fora de questão, o problema é que você está modificando os globais , o que é ruim. Se você estiver fornecendo seu código para uso de outras pessoas, ele não deverá ter efeitos colaterais imprevistos. Imagine se outra biblioteca também modificou o Array.prototypee estava fazendo algo um pouco diferente, então todo o seu código [].clear()estava um pouco errado. Isso não seria divertido de depurar. Portanto, a mensagem geral é: não modifique globais.
precisa saber é o seguinte
3
@thefourtheye O ponto principal de não modificar o escopo global é porque você não saberá se o código de outra pessoa já está (ou estará) usando o nome. Sugiro uma função dentro do escopo local. Portanto, dentro do IIFE do seu aplicativo / biblioteca , faça function clear(arr) { while(arr.length) arr.pop(); }e limpe os arrays com em clear(arr)vez de arr.clear().
jpillora
2
Acontece que esse método é muito mais lento que .splice()e .length=0. Os benchmarks não estavam corretos. Veja minha resposta atualizada.
Philippe Leybaert
216

Uma solução mais otimizada para vários navegadores e mais otimizada será usar o splicemétodo para esvaziar o conteúdo da matriz A, conforme abaixo:

A.splice(0, A.length);

Anthony
fonte
49
Por que isso é mais compatível com vários navegadores? Quais navegadores têm problemas com o A.length?
stricjux
4
@ jm2 o que você está dizendo não é inteiramente verdade. Na verdade, modifica a matriz em questão e, posteriormente, todas as referências são afetadas. Veja o teste no meu jsFiddle: jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya
3
@alex não, splicemodifica a matriz e retorna as entradas excluídas. Leia os documentos primeiro: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
David Hellsing
3
Poderíamos impedir a matriz resultante ser devolvido usando o operador vírgula : A.splice(0, A.length),0;. Isso deixaria um valor de retorno 0exatamente como A.length = 0;faria. A matriz resultante ainda é criada e deve fazer com que o script seja executado mais lentamente: ( jsperf ~ 56% mais lento). A implementação do navegador afetará isso, embora não haja razão para spliceque seja mais rápido que a configuração length.
Evan Kennedy
8
Eu também descobri que isso A.splice(0)também funciona.
Corwin.amber 4/04
97

As respostas que não têm menos que 2739 votos até agora são enganosas e incorretas.

A pergunta é: "Como você esvazia sua matriz existente?" Por exemplo, para A = [1,2,3,4].

  1. Dizer " A = []é a resposta" é ignorante e absolutamente incorreto. [] == []é falso .

    Isso ocorre porque essas duas matrizes são dois objetos individuais separados, com suas próprias duas identidades, ocupando seu próprio espaço no mundo digital, cada um por si.


Digamos que sua mãe pede que você esvazie a lata de lixo.

  • Você não traz um novo como se tivesse feito o que foi solicitado.
  • Em vez disso, você esvazia a lata de lixo.
  • Você não substitui a cheia por uma nova lata vazia e não pega o rótulo "A" da lata cheia e a cola na nova como em A = [1,2,3,4]; A = [];

Esvaziar um objeto de matriz é a coisa mais fácil de sempre:

A.length = 0;

Dessa forma, a lata em "A" não está apenas vazia, mas também limpa como nova!


  1. Além disso, você não precisa remover o lixo manualmente até que a lata esteja vazia! Você foi solicitado a esvaziar completamente o existente, em um turno, para não recolher o lixo até que a lata fique vazia, como em:

    while(A.length > 0) {
        A.pop();
    }
  2. Além disso, para colocar a mão esquerda na parte inferior do lixo, segure-a com a direita na parte superior para poder extrair o conteúdo, como em:

    A.splice(0, A.length);

Não, você foi solicitado a esvaziá-lo:

A.length = 0;

Este é o único código que esvazia corretamente o conteúdo de uma determinada matriz JavaScript.

Bekim Bacaj
fonte
11
O único problema com sua solução sugerida é que o lixo ainda existe, é só que você mudou o quadro de avisos dizendo que não há lixo. Uma referência à matriz antiga ainda deve existir. Você pode ter certeza de que o coletor de lixo ao definir .length = 0 também removerá todas as referências à matriz e suas propriedades? Eu acho que sim, mas para mim isso é mágico. Um método .clear () é desejável para evitar confusão, para dizer o mínimo.
mmm
8
Eu nunca afirmei que esta solução está errada. O problema é que esse segmento inteiro é completamente desnecessário. Mais de 3000 votos mostram que tentar descobrir qual é a melhor maneira deve torná-lo um argumento válido o suficiente para que os desenvolvedores de cabeçotes de crack da EMCA adicionem esse método. Ninguém deveria ter que descobrir isso. Existem três - quatro maneiras diferentes de fazer isso. Em alguns benchmarks, as soluções de comprimento são muito mais lentas que outras. Além disso, a idéia de definir .length = 0, para qualquer desenvolvedor razoável, não seria satisfatória.
Mmm15 /
2
Porque para realizar o que deveria, todas as referências devem ser removidas. .length = 0 nem sequer é uma chamada de método, portanto, se houver outras ações executadas quando estiver definida como 0 (que existe na maioria dos navegadores por meio do definidor de definição), eu ainda consideraria muito mágico confiar realmente que faz o que deveria façam.
Mmm15
7
Portanto, eu prefiro esclarecer pessoalmente. Um método claro pode ser prototipado, mas isso é apenas feio. O que quero dizer é que essa implementação já deve estar presente para que mais de 10.000 desenvolvedores não precisem passar horas lendo apenas esse encadeamento, sem considerar todos os outros que passaram mais tempo comparando.
Mmm15 /
1
existe apenas uma maneira de esvaziar sua matriz, preenchê-la com novos dados recebidos e descartá-la novamente. Todos os outros não são ou são ridiculamente ineficientes e imperdoavelmente famintos por CPU. A única alternativa prática é o A(n) = A.splice( 0, A.length );caso de você precisar fazer backup de seu conteúdo anterior. ps Array.lengthé uma propriedade de leitura-gravação \ método, caso você tenha esquecido esse fato básico. Ou seja, você pode expandi-lo para um novo comprimento, não pode cortá-lo para o comprimento que desejar e, entre outros, você pode descartar todos os membros encurtando seu comprimento para 0. É um canivete suíço da matriz.
Bekim Bacaj
63

Teste de performance:

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
fonte
9
A adição de alterações percentuais não é muito útil sem também notar sua plataforma. Na minha máquina, o pop é apenas um pouco mais rápido no Chrome 34, mas na verdade é mais lento que o [] do Firefox mais recente.
Styles Matt
2
Testando no Firefox 39.0 32 bits no Windows NT 6.3 de 64 bits, o a = [] é o mais rápido!
Reza-S4
5
Definitivamente, há algo suspeito neste resultado de teste no Chrome. Como diabos o loop de popping pode ser muito mais rápido que as outras 3 soluções?
chqrlie
9
@chqrlie Não é. É o método mais lento. O teste de benchmark é falho.
Philippe Leybaert 17/11
15
Exclua esta resposta, pois ela está errada, e os links para um teste defeituoso sem sentido como evidência falsa.
James Wakefield
35

Você pode adicionar isso ao seu arquivo JavaScript para permitir que suas matrizes sejam "limpas":

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

Então você pode usá-lo assim:

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

Ou se você quiser ter certeza de que não destrói algo:

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

Muitas pessoas pensam que você não deve modificar objetos nativos (como Array), e estou inclinado a concordar. Por favor, tenha cuidado ao decidir como lidar com isso.

sanguessuga
fonte
1
@naomik Você pode explicar seu raciocínio sobre por que fazer algo assim é desaprovado?
Indefinido
17
É "desaprovado" modificar funções primitivas de javascript como Array e String. Você poderia estar sobrecarregando uma função já existente e descartando a classe de objeto. Pode haver um mecanismo javascript obscuro que já possui clear () e espera que ele se comporte de uma maneira diferente. Pise com cuidado é tudo o que digo.
Design by Adrian
Que tal o problema de fazer uma pesquisa sobre os membros de uma matriz de repente começar a incluir uma clearchave?
ErikE 14/08/15
19

Há muita confusão e desinformação quanto ao tempo; desempenho pop / shift tanto em respostas quanto em comentários. A solução while / pop tem (como esperado) o pior desempenho . O que realmente está acontecendo é que a instalação é executada apenas uma vez para cada amostra que executa o snippet em um loop. por exemplo:

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
    }
}

Eu criei um novo teste que funciona corretamente:

http://jsperf.com/empty-javascript-array-redux

Aviso: mesmo nesta versão do teste, você não consegue ver a diferença real porque a clonagem da matriz ocupa a maior parte do tempo do teste. Ele ainda mostra que spliceé a maneira mais rápida de limpar a matriz (sem levar []em consideração porque, embora seja a mais rápida, na verdade não está limpando a matriz existente).

Diadistis
fonte
Muito bom ponto! Atualizarei a resposta original com os resultados corretos do benchmark.
Philippe Leybaert 16/02
Não acredito que ninguém tenha percebido esse erro de referência. Com mais de meio milhão de visualizações, você esperaria que alguém percebesse. Grande trabalho Diadistis
Philippe Leybaert
15

Caso esteja interessado na alocação de memória, você pode comparar cada abordagem usando algo como este jsfiddle em conjunto com a guia da linha do tempo das ferramentas de desenvolvimento do chrome. Você deseja usar o ícone da lixeira na parte inferior para forçar uma coleta de lixo após 'limpar' a matriz. Isso deve fornecer uma resposta mais definitiva para o navegador de sua escolha. Muitas respostas aqui são antigas e eu não confiaria nelas, mas sim testarei como na resposta de @ tanguy_k acima.

(para uma introdução à guia mencionada acima, você pode conferir aqui )

Stackoverflow me obriga a copiar o jsfiddle, então aqui 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>

E você deve observar que isso pode depender do tipo dos elementos da matriz, pois o javascript gerencia seqüências de caracteres de maneira diferente de outros tipos primitivos, sem mencionar as matrizes de objetos. O tipo pode afetar o que acontece.

matanster
fonte
15

Você pode criar facilmente uma função para fazer isso por você, alterar o comprimento ou até adicioná-la à matriz nativa como remove()função para reutilização.

Imagine que você tem esta matriz:

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

OK, basta executar o seguinte:

arr.length = 0; //change the length

e o resultado é:

[] //result

maneira fácil de esvaziar uma matriz ...

Também usando loop que não é necessário, mas apenas outra maneira de fazer isso:

/* 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(); 
  }
}

Também há maneiras difíceis de pensar, por exemplo, algo como isto:

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

Portanto, se arr tiver 5 itens, ele dividirá 5 itens de 0, o que significa que nada permanecerá na matriz.

Outras maneiras, como simplesmente reatribuir a matriz, por exemplo:

arr = []; //[]

Se você observar as funções de matriz, existem muitas outras maneiras de fazer isso, mas a mais recomendada pode ser a alteração do comprimento.

Como eu disse em primeiro lugar, você também pode criar protótipo remove (), pois é a resposta para sua pergunta. você pode simplesmente escolher um dos métodos acima e prototipá-lo para o objeto Array em JavaScript, algo como:

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

e você pode simplesmente chamar assim para esvaziar qualquer matriz em seu aplicativo javascript:

arr.remove(); //[]
Alireza
fonte
comprimento arr = 0; // altera o comprimento
Ajay Malhotra
14
Array.prototype.clear = function() {
    this.length = 0;
};

E chame: array.clear();

Bendegúz
fonte
77
Por favor, não incentive a modificação dos objetos nativos.
Obrigado
21
por que as pessoas têm essa tendência de pegar a resposta aceita e colocá-la em uma função de protótipo? Você realmente faz isso em seus projetos? Você tem uma enorme biblioteca de adições de protótipos que você inclui em todos os projetos?
Nurettin
4
Por que não apenas digitar array.length = 0?
Design by Adrian
10
@naomik "Por favor, não incentive a modificação dos objetos nativos." - Concordo plenamente com isso, mas apenas repetir a frase por si só parece arrogante. Alguém que propõe uma solução desse tipo provavelmente não está ciente das consequências, e deixar essa linha de lado em vez de fornecer uma breve explicação ou um link não transmite um significado diferente de "nós, pessoas mais inteligentes que você, pedimos para não fazer isso, porque sabemos melhor " .
John Weisz
12

A.splice(0);

Eu fiz isso em algum código no qual estou trabalhando. Limpou a matriz.

David Campbell
fonte
Não, você acabou de trocar um contêiner de matriz nomeado por um anônimo recém-criado. `var A = [1,2,3,4]; var B; B = A.splice (0); console.log (A); console.log (B); '
Bekim Bacaj
12

Se você estiver usando

a = []; 

Em seguida, você está atribuindo uma nova referência de matriz a, se a referência em a já estiver atribuída a qualquer outra variável, ela também não esvaziará a matriz e, portanto, o coletor de lixo não coletará essa memória.

Por ex.

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

ou

a.length = 0;

Quando especificamos a.length , estamos apenas redefinindo os limites da matriz e a memória para os elementos restantes da matriz serão conectados pelo coletor de lixo.

Em vez destas duas soluções são melhores.

a.splice(0,a.length)

e

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

Conforme a resposta anterior de kenshou.html, o segundo método é mais rápido.

Laxmikant Dange
fonte
10
Além de estar errado a.length, não vejo o que essa nova resposta adiciona ao tópico?
Bergi
@Bergi Eu só quero concentrar-se sobre a representação de memória real sobre gama
Laxmikant Dange
Você tem alguma fonte para confirmar quais mecanismos JS criarão uma nova matriz quando a.length=0;forem executados? Como esses motores agem a.length=500;e a.length=4;?
joeytwiddle
Eu tentei na maioria dos navegadores, como IE, Firefox, Chrome, está criando uma nova matriz. Se você definir um comprimento maior que 0, ele criará uma matriz com elementos indefinidos, ou seja, manterá apenas alguns locais de memória.
Laxmikant Dange
1
var a = [1]; var b = a; a.length = 0; console.log(b)imprime Array [ ], para que não pareça estar criando uma nova matriz para mim.
John Montgomery
9

Use uma versão modificada da sugestão inicial de Jan :

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}
cssimsek
fonte
12
Por que você gostaria de fazer isso? Por que adicionar mais duas variáveis ​​e um monte de código para fazer a mesma coisa?
Killah
6

Se você usa constantes, não tem escolha:

const numbers = [1, 2, 3]

Você não pode reasign:

numbers = []

Você só pode truncar:

numbers.length = 0
Damjan Pavlica
fonte
5

insira a descrição da imagem aqui

Para esvaziar um local de memória atual de uma matriz, use: 'myArray.length = 0'ou'myArray.pop() UN-till its length is 0'

  • length: Você pode definir a propriedade length para truncar uma matriz a qualquer momento. Quando você estende uma matriz alterando sua propriedade length, o número de elementos reais aumenta.
  • pop() : O método pop remove o último elemento de uma matriz e retorna que retorna o valor removido.
  • shift(): O método shift remove o elemento no índice zeroeth e desloca os valores em índices consecutivos para baixo e retorna o valor removido.

Exemplo:

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() | [] Crie uma matriz com a nova localização da memória usando Array constructorou 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() : Ao usar a função de fatia, obtemos uma cópia superficial dos elementos da matriz original, com novo endereço de memória, para que qualquer modificação no cloneArr não afete uma matriz original.

    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
fonte
"length: aparece até que o comprimento de uma matriz seja do tamanho especificado." Quem te contou essa bobagem?
Bekim Bacaj 13/11
@BekimBacaj Em essência, faz o mesmo efeito. Provavelmente deveria ter dito em length = ?vez de apenas length.
Tuupertunut
@BekimBacaj Eu atualizei minha resposta, apenas assumi que o comprimento aparece até o comprimento, mas corrigi agora que o comprimento apenas trunca ou aumenta o tamanho de uma matriz.
Yash
3

Estou surpreso que ninguém tenha sugerido isso ainda:

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

Isso gera uma matriz em um estado completamente diferente das outras soluções. Em certo sentido, a matriz foi 'esvaziada':

xs
=> Array [ <4 empty slots> ]

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

xs.length
=> 4

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

Você pode produzir uma matriz equivalente com [,,,,]ouArray(4)

Cauterita
fonte
7
Pode ser uma boa resposta para uma pergunta diferente: "Como converter todos os elementos de uma matriz em elementos indefinidos".
Ruben
Embora internamente existe uma diferença entre os elementos indefinidos e espaços vazios ( "buracos")
Cauterite
-9

Use abaixo se você precisar esvaziar o Angular 2+ FormArray.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}
Manish Jain
fonte
10
Isso é irrelevante e nem mesmo JavaScript.
Emile Bergeron