Como desmarcar um elemento em uma matriz em javascript?

138

Como removo a chave 'bar' de uma matriz foo para que 'bar' não apareça em

for(key in foo){alert(key);}
Steven Noble
fonte

Respostas:

243

Não use delete, pois ele não removerá um elemento de uma matriz, apenas a definirá como indefinida, o que não será refletido corretamente no comprimento da matriz.

Se você sabe a chave que você deve usar tala ou seja,

myArray.splice(key, 1);

Para alguém na posição de Steven, você pode tentar algo como isto:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

ou

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}
indo
fonte
3
+1 Bom ponto, também gosto desta maneira: ejohn.org/blog/javascript-array-remove
CMS
3
@ThiefMaster - Gostaria de explicar? Não sei o que isso significa e desejo aprender. Como sempre, uma edição é 1.000.000 vezes melhor que um comentário indireto; você deve saber que com a quantidade de representante que possui.
indo
21
Use em for (var key in myArray)vez de for (key in myArray)- caso contrário, keyé uma variável global e se você chamar uma função dentro desse loop com o mesmo problema, obterá resultados inesperados.
ThiefMaster
2
Observe que o segundo exemplo não funciona se a matriz tiver vários itens seguidos que correspondem a 'barra'. O índice da matriz mudará e você perderá metade dos itens emendados. Em vez disso, use um loop for que diminua o índice quando uma correspondência for encontrada.
Dave Lancea
Para uma matriz de objetos: stackoverflow.com/questions/15287865/…
Fedir RYKHTIK
52
delete foo[key];

: D


fonte
4
tecnicamente, isso não responde à pergunta. ele está olhando para remover a chave 'barra'. e sua variável-chave não implica isso. : P
Kon
4
key = 'barra'; eval ("excluir foo." + tecla); couros ; D
olliej
3
Você não usar eval. A exclusão de uma chave / índice de um objeto / matriz pode ser alcançada por métodos muito mais simples que não são utilizados eval.
Dinei
4
Na verdade, se você remover do array indexado excluindo foo [key], ele armazenará o valor em foo [key] = indefinido e foo.length permanecerá o mesmo, o que está errado. Então uso SPLICE vez
Павел Иванов
use delete foo [key] errado; deve usar foo.splice (chave, 1);
vnguyen
38

Uma observação importante: as matrizes JavaScript não são matrizes associativas como as que você pode estar acostumado a partir do PHP. Se a sua "chave de matriz" for uma sequência, você não estará mais operando no conteúdo de uma matriz. Sua matriz é um objeto e você está usando a notação de colchete para acessar o membro chamado <nome da chave>. Portanto:

var myArray = [];
myArray ["bar"] = true;
myArray ["foo"] = true;
alerta (myArray.length); // retorna 0.

porque você não adicionou elementos à matriz, apenas modificou os membros bar e foo do myArray.

John Factorial
fonte
37

Se você souber o nome da chave, faça o seguinte:

delete array['key_name']
user3177525
fonte
2
Isto não é uma matriz! É um objeto (sim, eles são chamados de matrizes associativas em JS, mas não, na verdade não são, e esse método é prejudicial se você realmente trabalhar com uma matriz de JS).
7898 wintercounter
3

É assim que eu faria

 myArray.splice( myArray.indexOf('bar') , 1) 
stackoverflows
fonte
1
O método Array.prototype.indexOf () procura um valor dentro de uma matriz, não uma chave. Então isso não vai funcionar.
Nadav 23/01