Suponha que eu tenha esse código:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Agora, se eu queria remover "sobrenome"? .... existe algum equivalente a
myArray["lastname"].remove()
?
(Preciso que o elemento seja removido porque o número de elementos é importante e quero manter as coisas limpas.)
"Test" + {};
é uma instrução JS perfeitamente válida.Respostas:
Objetos em JavaScript podem ser vistos como matrizes associativas, mapeando chaves (propriedades) para valores.
Para remover uma propriedade de um objeto em JavaScript, use o
delete
operador:Observe que quando
delete
aplicado a uma propriedade de índice de umArray
, você criará uma matriz escassamente povoada (ou seja, uma matriz com um índice ausente).Ao trabalhar com instâncias de
Array
, se você não deseja criar uma matriz escassamente povoada - e geralmente não o faz -, useArray#splice
ouArray#pop
.Observe que o
delete
operador em JavaScript não libera memória diretamente. Seu objetivo é remover propriedades dos objetos. Obviamente, se uma propriedade que está sendo excluída tiver a única referência restante para um objetoo
, elao
será posteriormente coletada como lixo normalmente.O uso do
delete
operador pode afetar a capacidade dos mecanismos JavaScript de otimizar o código .fonte
delete myArray[0]
. Consulte stackoverflow.com/a/9973592/426379 e Excluindo elementos da matrizlength
propriedade de um objeto Array permanece inalterada.myArray
realmente fosse usado como uma matriz - mas não é (myArray
é um nome lamentável), é um objeto. Então, neste caso,delete
está OK. Observe que, mesmo que tenha sido criado comonew Array()
e usado como matriz associativa, ainda estará OK. Seu aviso ainda é algo a ter em atenção se estiver usando matrizes reais.Todos os objetos em JavaScript são implementados como hashtables / matrizes associativas. Portanto, o seguinte é o equivalente:
E, como já indicado, você "remove" uma propriedade de um objeto por meio da
delete
palavra - chave, que pode ser usada de duas maneiras:Espero que a informação extra ajude ...
fonte
myObj['some;property']
, funciona, masmyObj.some;property
não funcionaria (por razões óbvias). Além disso, pode não ser óbvio que você pode usar uma variável na notação de colchete, ou seja,var x = 'SomeProperty'; alert(myObj[x])
Nenhuma das respostas anteriores aborda o fato de que o Javascript não possui matrizes associativas para começar - não há nenhum
array
tipo como tal, consultetypeof
.O que o Javascript possui, são instâncias de objetos com propriedades dinâmicas. Quando as propriedades são confundidas com elementos de uma instância de objeto Array, Bad Things ™ acontece:
Problema
Solução
Para ter uma função de remoção universal que não explode em você, use:
fonte
Array
s em JS são objetos, tentetypeof new Array();
outypeof []
verifique.Array
é simplesmente um certo tipo de objeto e não um "animal diferente". Em JS, os objetos são diferenciados pelo nome do construtor e pela cadeia de protótipos, consulte Programação baseada em protótipo .delete
operador de deficiência em relação aoArray
fornecimento de uma função polimórfica simples.delete
não tem deficiência.delete
foi projetado para remover propriedades. É isso aí. A aplicação do operador de exclusão a um índice de uma matriz remove esse índice. O que mais precisa fazer? Você fica com uma matriz esparsa, que é um recurso do idioma. Se você não deseja uma matriz esparsa, não exclua o índice: usesplice
oupop
.Isso remove apenas exclui o objeto, mas ainda mantém o mesmo comprimento da matriz.
Para remover, você precisa fazer algo como:
fonte
Embora a resposta aceita esteja correta, falta a explicação do motivo pelo qual ela funciona.
Primeiro de tudo, seu código deve refletir o fato de que NÃO é uma matriz:
Observe que todos os objetos (incluindo
Array
s) podem ser usados dessa maneira. No entanto, não espere que as funções padrão da matriz JS (pop, push, ...) funcionem em objetos!Como dito na resposta aceita, você pode usar
delete
para remover as entradas dos objetos:Você deve decidir qual rota deseja seguir - use objetos (matrizes / dicionários associativos) ou use matrizes (mapas). Nunca misture os dois.
fonte
Use o método
splice
para remover completamente o item de uma matriz de objetos:fonte
Como outras respostas observaram, o que você está usando não é uma matriz Javascript, mas um objeto Javascript, que funciona quase como uma matriz associativa em outros idiomas, exceto que todas as chaves são convertidas em strings. O novo mapa armazena chaves como seu tipo original.
Se você tivesse uma matriz e não um objeto, poderia usar a função .filter da matriz para retornar uma nova matriz sem o item que você deseja remover:
Se você possui um navegador mais antigo e o jQuery, o jQuery possui um
$.grep
método que funciona da mesma forma:fonte
Há uma maneira elegante no Guia de Estilo do Airbnb para fazer isso (ES7):
Direitos autorais: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
fonte
Você está usando Objeto, não está tendo uma matriz associativa para começar. Com uma matriz associativa, adicionar e remover itens é assim:
fonte
Você pode remover uma entrada do seu mapa atribuindo-a explicitamente a 'indefinida'. Como no seu caso:
fonte
Se, por qualquer motivo, a chave de exclusão não estiver funcionando (como se não estivesse funcionando para mim)
Você pode dividir e filtrar os valores indefinidos
Não tente encadeá-los, pois a emenda retorna os elementos removidos;
fonte
Também podemos usá-lo como uma função. Angular gera algum erro se usado como protótipo. Obrigado @HarpyWar. Isso me ajudou a resolver um problema.
fonte
É muito simples se você tiver dependência de underscore.js no seu projeto -
fonte
Usando a
"delete"
palavra-chave, ele excluirá o elemento da matriz em javascript.Por exemplo,
Considere as seguintes instruções.
A última linha do código removerá o elemento da matriz cuja chave é "status" da matriz.
fonte
Sem repetir / iterar, obtemos o mesmo resultado
fonte
Para "Matrizes":
Se você conhece o índice:
Se você conhece o valor:
A resposta mais votada para
delete
funciona bem no caso de objetos, mas não para as matrizes reais. Se eu usá-delete
lo remove elementos de loops, mas mantém o elemento comoempty
e o comprimento da matriz não muda. Isso pode ser um problema em alguns cenários.Por exemplo, se eu executar myArray.toString () no myArray após a remoção,
delete
ele criará uma entrada vazia, ou seja,fonte
O único método de trabalho para mim:
uso:
fonte