Digamos que eu crie um objeto da seguinte maneira:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Qual é a melhor maneira de remover a propriedade regex
para terminar com nova da myObject
seguinte maneira?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
johnstok
fonte
fonte
delete
seria a opção mais lenta, pois é uma operação real, e não as outras duas, que são apenas tarefas simples. Mas o cerne da questão é que atribuir a propriedadenull
ouundefined
na verdade não remover a propriedade do objeto, mas, em vez disso, define essa propriedade para ser igual a um valor constante específico. (As respostas abaixo dão razões pelas quais essa é uma diferença significativa.)Respostas:
Como isso:
Demo
Para qualquer pessoa interessada em ler mais sobre isso, o usuário do Stack Overflow kangax escreveu uma postagem de blog incrivelmente detalhada sobre a
delete
declaração em seu blog, Entendendo a exclusão . É altamente recomendado.fonte
var x = {a : 'A', b : 'B'};
Compare:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
ax.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Objetos em JavaScript podem ser vistos como mapas entre chaves e valores. O
delete
operador é usado para remover essas chaves, mais conhecidas como propriedades do objeto, uma de cada vez.O
delete
operador não libera memória diretamente e difere de simplesmente atribuir o valor denull
ouundefined
a uma propriedade, pois a própria propriedade é removida do objeto. Observe que se o valor de uma propriedade excluída fosse um tipo de referência (um objeto) e outra parte do seu programa ainda contiver uma referência a esse objeto, é claro que esse objeto não será coletado como lixo até que todas as referências a ele sejam desaparecido.delete
funcionará apenas em propriedades cujo descritor as marca como configuráveis.fonte
Isso funciona no Firefox e no Internet Explorer, e acho que funciona em todos os outros.
fonte
O
delete
operador é usado para remover propriedades dos objetos.Observe que, para matrizes, isso não é o mesmo que remover um elemento . Para remover um elemento de uma matriz, use
Array#splice
ouArray#pop
. Por exemplo:Detalhes
delete
em JavaScript tem uma função diferente da palavra-chave em C e C ++: ela não libera memória diretamente. Em vez disso, seu único objetivo é remover propriedades dos objetos.Para matrizes, a exclusão de uma propriedade correspondente a um índice cria uma matriz esparsa (isto é, uma matriz com um "furo" nela). A maioria dos navegadores representa esses índices de matriz ausentes como "vazios".
Observe que
delete
não é realocadoarray[3]
paraarray[2]
.Diferentes funções internas no JavaScript lidam com matrizes esparsas de maneira diferente.
for...in
pulará o índice vazio completamente.Um
for
loop tradicional retornaráundefined
para o valor no índice.Qualquer método usando
Symbol.iterator
retornaráundefined
para o valor no índice.forEach
,map
ereduce
simplesmente pulará o índice ausente.Portanto, o
delete
operador não deve ser usado para o caso de uso comum de remover elementos de uma matriz. As matrizes têm métodos dedicados para remover elementos e realocar memória:Array#splice()
eArray#pop
.Matriz # emenda (start [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
modifica a matriz e retorna todos os índices removidos.deleteCount
elementos são removidos do índicestart
eitem1, item2... itemN
inseridos na matriz do índicestart
. SedeleteCount
for omitido, os elementos de startIndex serão removidos no final da matriz.Há também um nome semelhante, mas diferente, função em
Array.prototype
:Array#slice
.Matriz # fatia ([início [, fim]])
Array#slice
é não destrutivo e retorna uma nova matriz que contém os índices indicados destart
paraend
. Se nãoend
for especificado, o padrão será o final da matriz. Seend
for positivo, especifica o índice não inclusivo baseado em zero no qual parar. Seend
for negativo, especifica o índice no qual parar, contando desde o final da matriz (por exemplo, -1 omitirá o índice final). Seend <= start
, o resultado é uma matriz vazia.Matriz # pop
Array#pop
remove o último elemento de uma matriz e retorna esse elemento. Esta operação altera o comprimento da matriz.fonte
delete
e criar uma função Garbage Collection para limpá-la.splice
na sua edição, masremove
deveria serArray.prototype.remove = function(index) { this.splice(index, 1); };
Pergunta antiga, resposta moderna. Usando a destruição de objetos, um recurso do ECMAScript 6 , é tão simples quanto:
Ou com o exemplo de perguntas:
Você pode vê-lo em ação no editor de testes da Babel.
Editar:
Para reatribuir à mesma variável, use a
let
:fonte
regex
você também pode atribuí-la a qualquer outra variável, por exemplo_
, o que é usado em linguagens como Ir para descartar um resultado:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
mas não, então não acho possível com a desestruturação.freeze()
d eseal()
d, você não pode simplesmentedelete
uma propriedade. Portanto, esta é uma excelente alternativa. Embora na maioria dos casos, provavelmente não faça sentido excluir uma propriedade de um objeto congelado / selado de qualquer maneira, considerando que o objetivo principal é garantir certas estruturas de dados, das quais esse padrão estaria prejudicando. Para os casos em que você precisa para não-destrutiva enganar um objeto, mas sem algumas de suas propriedades, este é perfeitoSintaxe de propagação (ES6)
Para quem precisa ...
Para concluir a resposta do @Koen neste tópico, caso você queira remover a variável dinâmica usando a sintaxe de propagação, faça o seguinte:
*
foo
será uma nova variável com o valor dea
(que é 1).RESPOSTA ESTENDIDA few
Existem poucas maneiras comuns de remover uma propriedade de um objeto.
Cada um tem seus próprios prós e contras ( verifique esta comparação de desempenho ):
Excluir operador
legível e curto, no entanto, pode não ser a melhor opção se você estiver operando em um grande número de objetos, pois seu desempenho não é otimizado.
Reatribuição
Mais que 2X mais rápido que
delete
, no entanto, a propriedadenãoéexcluída e pode ser iterada.Operador de propagação
Esse
ES6
operador nos permite retornar um objeto novo em folha, excluindo quaisquer propriedades, sem alterar o objeto existente. A desvantagem é que ele apresenta o pior desempenho dentre os itens acima e não é sugerido o uso quando você precisar remover muitas propriedades ao mesmo tempo.fonte
Outra alternativa é usar a biblioteca Underscore.js .
Note que
_.pick()
e_.omit()
tanto retorno uma cópia do objeto e não modificar diretamente o objeto original. A atribuição do resultado ao objeto original deve fazer o truque (não mostrado).Referência: link _.pick (objeto, * teclas)
Retorne uma cópia do objeto, filtrada para ter apenas valores para as chaves da lista de permissões (ou matriz de chaves válidas).
Referência: link _.omit (objeto, * teclas)
Retorne uma cópia do objeto, filtrada para omitir as chaves da lista negra (ou matriz de chaves).
Para matrizes
_.filter()
e_.reject()
pode ser usado de maneira semelhante.fonte
_.omit(collection, key.toString())
delete obj[prop]
que é ~ 100x mais lento queobj[prop] = undefined
.O termo que você usou no título da sua pergunta
Remove a property from a JavaScript object
pode ser interpretado de várias maneiras diferentes. Um é removê-lo para toda a memória e a lista de chaves de objeto ou o outro é apenas para removê-lo do seu objeto. Como foi mencionado em algumas outras respostas, adelete
palavra-chave é a parte principal. Digamos que você tenha seu objeto como:Se você fizer:
o resultado seria:
Você pode excluir essa chave específica de suas chaves de objeto, como:
Então, sua chave de objetos usando
Object.keys(myJSONObject)
seria:Mas o ponto é que se você se preocupa com a memória e deseja remover todo o objeto da memória, é recomendável configurá-lo como nulo antes de excluir a chave:
O outro ponto importante aqui é ter cuidado com as outras referências ao mesmo objeto. Por exemplo, se você criar uma variável como:
Ou adicione-o como um novo ponteiro a outro objeto como:
Então, mesmo que você o remova do objeto
myJSONObject
, esse objeto específico não será excluído da memória, pois aregex
variável emyOtherObject["regex"]
ainda tem seus valores. Então, como podemos remover o objeto da memória, com certeza?A resposta seria excluir todas as referências que você possui no seu código, apontar para esse mesmo objeto e também não usar
var
instruções para criar novas referências a esse objeto . Este último ponto em relação àsvar
declarações é um dos problemas mais cruciais com os quais geralmente nos deparamos, porque usarvar
instruções impediria que o objeto criado fosse removido.O que significa que, nesse caso, você não poderá remover esse objeto porque criou a
regex
variável por meio de umavar
instrução e, se o fizer:O resultado seria
false
, o que significa que sua instrução de exclusão não foi executada conforme o esperado. Mas se você não tivesse criado essa variável antes e tivesse apenasmyOtherObject["regex"]
a última referência existente, poderia ter feito isso apenas removendo-a como:Em outras palavras, um objeto JavaScript é morto assim que não há mais nenhuma referência no seu código apontada para esse objeto.
Atualização: Graças ao @AgentME:
Para obter mais informações sobre
Object.seal
: Object.seal ()fonte
myJSONObject.regex
o valor de uma string e você o atribui a outro objeto, o outro objeto possui uma cópia desse valor.O ECMAScript 2015 (ou ES6) veio com o objeto Reflect embutido . É possível excluir a propriedade do objeto chamando a função Reflect.deleteProperty () com o objeto de destino e a chave de propriedade como parâmetros:
que é equivalente a:
Mas se a propriedade do objeto não for configurável, ela não poderá ser excluída nem com a função deleteProperty nem com o operador delete:
Object.freeze () torna todas as propriedades do objeto não configuráveis (além de outras coisas).
deleteProperty
A função (assim como o operador delete ) retornafalse
quando tenta excluir qualquer uma de suas propriedades. Se a propriedade for configurável, ela retornarátrue
, mesmo que a propriedade não exista.A diferença entre
delete
edeleteProperty
é ao usar o modo estrito:fonte
apply
,call
,bind
funções ...Suponha que você tenha um objeto parecido com este:
Excluindo uma propriedade de objeto
Se você deseja usar toda a
staff
matriz, a maneira correta de fazer isso seria:Como alternativa, você também pode fazer isso:
Da mesma forma, a remoção de toda a matriz de alunos seria feita chamando
delete Hogwarts.students;
oudelete Hogwarts['students'];
.Excluindo um índice de matriz
Agora, se você deseja remover um único membro da equipe ou aluno, o procedimento é um pouco diferente, porque as duas propriedades são elas mesmas.
Se você conhece o índice do seu membro da equipe, você pode simplesmente fazer o seguinte:
Se você não conhece o índice, também precisará fazer uma pesquisa no índice:
Nota
Embora você possa usar tecnicamente
delete
para uma matriz, usá-la resultaria em resultados incorretos ao chamar, por exemplo,Hogwarts.staff.length
mais tarde. Em outras palavras,delete
removeria o elemento, mas não atualizaria o valor dalength
propriedade. O usodelete
também atrapalhava sua indexação.Portanto, ao excluir valores de um objeto, sempre considere primeiro se você está lidando com propriedades do objeto ou se está lidando com valores de matriz e escolha a estratégia apropriada com base nisso.
Se você quiser experimentar isso, pode usar este Fiddle como ponto de partida.
fonte
splice
em uma matriz em vez dedelete
.delete
nem deveria ser uma coisa. Ésplice
isso que o OP estava procurando.delete
deve ser usado para propriedades de objetos esplice
elementos de matriz.delete
matrizes, seria mais sensato não criar código centralizado em torno dele.Usando o ES6:
(Operador de Reestruturação + Spread)
fonte
Eu pessoalmente uso Underscore.js ou Lodash para manipulação de objetos e matrizes:
fonte
O operador de exclusão é a melhor maneira de fazer isso.
Um exemplo ao vivo para mostrar:
fonte
delete
operador seja saudável em relação à coleta de lixo , ele pode ser inesperadamente lento , em grande parte pelo mesmo motivo.Para clonar objeto sem propriedade:
Por exemplo:
E precisamos excluir 'a'.
1.Com chave de suporte explícita:
2. Com chave de suporte variável:
Função da seta 3.Cool:
4. Para várias propriedades
Uso
Ou
fonte
Usar o método delete é a melhor maneira de fazer isso, conforme a descrição do MDN, o operador delete remove uma propriedade de um objeto. Então você pode simplesmente escrever:
O fragmento a seguir fornece outro exemplo simples:
Para obter mais informações e ver mais exemplos, visite o link abaixo:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
fonte
Outra solução, usando
Array#reduce
.No entanto, ele irá transformar o objeto original. Se você deseja criar um novo objeto sem a chave especificada, apenas atribua a função de redução a uma nova variável, por exemplo:
(ES6)
fonte
Este post é muito antigo e eu acho muito útil, então decidi compartilhar a função não configurada que escrevi, caso alguém o veja e pense por que não é tão simples quanto na função não configurada PHP.
O motivo para escrever essa nova
unset
função é manter o índice de todas as outras variáveis neste hash_map. Veja o exemplo a seguir e veja como o índice de "test2" não foi alterado após remover um valor do hash_map.fonte
Há muitas boas respostas aqui, mas quero enfatizar que, ao usar delete para remover uma propriedade em JavaScript, geralmente é aconselhável verificar primeiro se essa propriedade existe para evitar erros.
Por exemplo
Devido à natureza dinâmica do JavaScript, geralmente há casos em que você simplesmente não sabe se a propriedade existe ou não. Verificar se obj existe antes do && também garante que você não gere um erro devido à chamada da função hasOwnProperty () em um objeto indefinido.
Desculpe se isso não foi adicionado ao seu caso de uso específico, mas acredito que este seja um bom design para se adaptar ao gerenciar objetos e suas propriedades.
fonte
delete foo.bar;
somente lança uma exceção se foo for falso ou se você estiver no modo estrito e foo for um objeto com uma propriedade de barra não configurável.Usando ramda # dissoc, você obterá um novo objeto sem o atributo
regex
:Você também pode usar outras funções para obter o mesmo efeito - omitir, escolher, ...
fonte
Tente o seguinte método. Atribua o
Object
valor da propriedade aundefined
. Entãostringify
o objeto eparse
.fonte
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Se você deseja excluir uma propriedade profundamente aninhada no objeto, pode usar a seguinte função recursiva com caminho para a propriedade como o segundo argumento:
Exemplo:
fonte
Você pode simplesmente excluir qualquer propriedade de um objeto usando a
delete
palavra - chavePor exemplo:
Para remover qualquer propriedade, digamos
key1
, use adelete
palavra - chave assim:Ou você também pode usar a notação de matriz:
Ref: MDN .
fonte
Object.assign () & Object.keys () & Array.map ()
fonte
A afirmação de Dan de que 'excluir' é muito lenta e a referência que ele postou foi duvidosa. Portanto, eu mesmo realizei o teste no Chrome 59. Parece que 'delete' é cerca de 30 vezes mais lento:
Observe que, propositadamente, realizei mais de uma operação de 'exclusão' em um ciclo de loop para minimizar o efeito causado pelas outras operações.
fonte
Considere criar um novo objeto sem a
"regex"
propriedade porque o objeto original sempre pode ser referenciado por outras partes do seu programa. Portanto, você deve evitar manipulá-lo.fonte
SyntaxError: Unexpected token '...'. Expected a property name.
?Remoção de propriedade em JavaScript
Existem muitas opções diferentes apresentadas nesta página, não porque a maioria das opções esteja errada - ou porque as respostas são duplicadas - mas porque a técnica apropriada depende da situação em que você está e dos objetivos das tarefas que você e / ou você equipe está tentando cumprir. Para responder sua pergunta inequivocamente, é preciso saber:
Depois que essas quatro perguntas forem respondidas, existem basicamente quatro categorias de "remoção de propriedade" no JavaScript para escolher, a fim de atingir seus objetivos. Eles são:
Exclusão de propriedade de objeto mutativa, insegura
Essa categoria é para operar em literais ou instâncias de objeto quando você deseja manter / continuar usando a referência original e não está usando princípios funcionais sem estado no seu código. Um exemplo de sintaxe nesta categoria:
Esta categoria é a categoria de remoção de propriedade mais antiga, direta e amplamente suportada. Ele suporta
Symbol
& índices de matriz, além de strings e funciona em todas as versões do JavaScript, exceto na primeira versão. No entanto, é mutativo que viola alguns princípios de programação e tem implicações no desempenho. Também pode resultar em exceções não capturadas quando usado em propriedades não configuráveis no modo estrito .Omissão de propriedade de sequência baseada em descanso
Essa categoria é para operar em instâncias simples de objeto ou matriz em tipos mais recentes de ECMAScript quando uma abordagem não-mutativa é desejada e você não precisa considerar as chaves Symbol:
Exclusão mutável de propriedade de objeto, segura
Esta categoria é para operar em literais de objetos ou instâncias de objetos quando você deseja manter / continuar a usar a referência original enquanto se protege contra exceções lançadas em propriedades não configuráveis:
Além disso, embora a mutação de objetos no local não seja apátrida, você pode usar a natureza funcional de
Reflect.deleteProperty
fazer aplicação parcial e outras técnicas funcionais que não são possíveis comdelete
instruções.Omissão de propriedade de cadeia de caracteres baseada em sintaxe
Essa categoria é para operar em instâncias simples de objeto ou matriz em tipos mais recentes de ECMAScript quando uma abordagem não-mutativa é desejada e você não precisa considerar as chaves Symbol:
Omissão de propriedade baseada em biblioteca
Essa categoria geralmente permite maior flexibilidade funcional, incluindo contabilização de símbolos e omissão de mais de uma propriedade em uma instrução:
fonte
fonte
delete myObject.regex;
.Você pode usar a desestruturação do ES6 com o operador rest.
As propriedades podem ser removidas usando a desestruturação em combinação com o operador restante . No seu exemplo, a regex é destruída (ignorada) e o restante das propriedades é retornado como restante.
Ou você pode excluir dinamicamente propriedades como esta,
fonte
Podemos remover qualquer propriedade de um objeto javascript usando o seguinte:
exemplo:
fonte
Tente isto
fonte