Qual é uma maneira boa e curta de remover um valor de um objeto em uma chave específica sem alterar o objeto original?
Eu gostaria de fazer algo como:
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
Sei que existem muitas bibliotecas de imutabilidade para essas tarefas, mas gostaria de sair sem uma biblioteca. Mas, para fazer isso, um requisito seria ter um caminho fácil e curto que possa ser usado em todo o código, sem abstrair o método como uma função de utilidade.
Por exemplo, para adicionar um valor, faço o seguinte:
let o2 = {...o1, age: 31};
É muito curto, fácil de lembrar e não precisa de uma função de utilidade.
Existe algo assim para remover um valor? ES6 é muito bem-vindo.
Muito obrigado!
javascript
immutability
amann
fonte
fonte
Respostas:
Atualizar:
Você pode remover uma propriedade de um objeto com uma atribuição complicada de Destructuring :
Porém, se o nome da propriedade que você deseja remover for estático, você pode removê-lo com uma linha simples:
A maneira mais fácil é simplesmenteclonar seu objeto antes de transformá-lo:Alternativamente, você pode usar a
omit
função dalodash
biblioteca de utilitários :Está disponível como parte do pacote lodash ou como pacote lodash.omit independente .
fonte
a2 = a1.filter(el => el.id !== id)
omitir um elemento dentro de uma matriz por um id específico. Não existe tal coisa para um objeto?keep_if
const {[prop], ...rest} = obj
funciona? Por que você tem que atribuir a propriedade extraída a uma nova variável (omit
neste caso)?Com a desestruturação de objetos ES7:
fonte
a
estiver armazenado em uma variávelconst x = 'a'
?const { a,b, ...noA } = myObject;
console.log(noA); // => {c: 3 }
solução de uma linha
fonte
Conforme sugerido nos comentários acima, se você quiser estender isso para remover mais de um item de seu
object
gosto de usarfilter
. ereduce
por exemplo
fonte
Para adicionar algum tempero trazendo desempenho. Verifique este tópico abaixo
https://github.com/googleapis/google-api-nodejs-client/issues/375
Você também pode usar a forma destrutiva
E um exemplo mais prático:
Como você pode ver, você pode usar a
[somePropsVarForDynamicName]: scopeVarName
sintaxe para nomes dinâmicos. E você pode colocar tudo entre colchetes (novo bloco) para que o resto seja coletado como lixo depois disso.Aqui está um teste:
exec:
Ou podemos ir com alguma função como
para texto datilografado
Uso:
Desta forma, um novo objeto é criado. E a propriedade rápida do objeto é mantida. O que pode ser importante ou importante. Se o mapeamento e o objeto serão acessados muitas vezes.
Associar-se também
undefined
pode ser uma boa maneira de prosseguir. Quando você puder pagar. E para as chaves, você também pode verificar o valor. Por exemplo, para obter todas as chaves ativas, você faz algo como:Undefined não é adequado para uma lista grande. Ou desenvolvimento ao longo do tempo com muitos adereços surgindo. Como o uso de memória continuará crescendo e nunca será limpo. Portanto, depende do uso. E apenas criar um novo objeto parece ser o bom caminho.
Em seguida, o
Premature optimization is the root of all evil
será ativado. Portanto, você precisa estar ciente da troca. E o que é necessário e o que não é.Nota sobre _.omit () de lodash
Ele foi removido da versão 5. Você não pode encontrá-lo no repo. E aqui está uma questão que falamos sobre isso.
https://github.com/lodash/lodash/issues/2930
v8
Você pode verificar isso, o que é uma boa leitura https://v8.dev/blog/fast-properties
fonte
com lodash cloneDeep e delete
(nota: clone lodash pode ser usado em vez de objetos rasos)
fonte
Para meu código, eu queria uma versão curta para o valor de retorno de map (), mas as soluções de operações multiline / mutli eram "feias". A principal característica é o antigo
void(0)
que resolveundefined
.A propriedade permanece no objeto:
mas a estrutura de transmissão mata para mim (bc stringify):
fonte
Meu problema com a resposta aceita, de um padrão de regra ESLint, se você tentar desestruturar:
as 2 novas variáveis
notNeeded
ealsoNotNeeded
podem lançar um aviso ou erro dependendo de sua configuração, uma vez que agora não são utilizadas. Então, por que criar novos vars se não forem usados?Acho que você precisa
delete
realmente usar a função.fonte
no-unused-vars
regra, na verdade, tem uma opçãoignoreRestSiblings
agora para cobrir este caso de uso: eslint.org/docs/rules/no-unused-vars#ignorerestsiblings