Eu tenho um objeto JS simples:
{a: 1, b: 2, c: 3, ..., z:26}
Eu quero clonar o objeto, exceto um elemento:
{a: 1, c: 3, ..., z:26}
Qual é a maneira mais fácil de fazer isso (preferindo usar o es6 / 7, se possível)?
Eu tenho um objeto JS simples:
{a: 1, b: 2, c: 3, ..., z:26}
Eu quero clonar o objeto, exceto um elemento:
{a: 1, c: 3, ..., z:26}
Qual é a maneira mais fácil de fazer isso (preferindo usar o es6 / 7, se possível)?
Respostas:
Se você usar Babel, poderá usar a seguinte sintaxe para copiar a propriedade b de x na variável be, em seguida, copiar o restante das propriedades na variável y :
e será transpilado para:
fonte
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
que foi adicionada na v3.15.0 (3 de fevereiro de 2017). Veja: commit c59a0bab
escopo.ou se você aceitar que a propriedade seja indefinida:
fonte
Para adicionar à resposta de Ilya Palkin: você pode remover dinamicamente as chaves:
Demonstração em Babel REPL
Fonte:
fonte
_
que é permitido para uma variável que você não pretende usar?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Para aqueles que não podem usar o ES6, você pode usar
lodash
ouunderscore
.Or
ramda
.fonte
_.omit(x, 'b')
delete
.Eu uso este forro ESNext one
Se você precisar de uma função de uso geral:
fonte
map
você pode:(({b, c, ...others}) => ({...others}))(obj)
Você pode escrever uma função auxiliar simples para ela. Lodash tem uma função semelhante com o mesmo nome: omit
Além disso, observe que é mais rápido que Object.assign e exclua: http://jsperf.com/omit-key
fonte
Talvez algo parecido com isto:
Isso é bom o suficiente? Ou não pode
c
realmente ser copiado?fonte
Usando a Reestruturação de Objetos
fonte
_
não resolve o problema para ESLint ...Ei, parece que você encontra problemas de referência quando tenta copiar um objeto e excluir uma propriedade. Em algum lugar você precisa atribuir variáveis primitivas para que o javascript crie um novo valor.
Truque simples (pode ser horrível) eu usei foi este
fonte
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Nem precisa excluí-lo, apenas precisa de um valor falso.Aqui está uma opção para omitir chaves dinâmicas que, acredito, ainda não foram mencionadas:
removeMe
é aliasremovedKey
e ignorado.newObj
torna-se{ 2: 2, 3: 3, 4: 4 }
. Observe que a chave removida não existe, o valor não foi apenas definido comoundefined
.fonte
fonte
Omitir Lodash
fonte
Você também pode usar o operador spread para fazer isso
fonte
copy
const copy = { ...source, b: undefined }
resume-se exatamente ao mesmo.As soluções acima usando a estruturação sofrem com o fato de você ter uma variável usada, o que pode causar reclamações do ESLint se você a estiver usando.
Então, aqui estão minhas soluções:
Na maioria das plataformas (exceto no IE, a menos que você use o Babel), você também pode:
fonte
Que tal agora:
fonte
Se você está lidando com uma variável enorme, não deseja copiá-la e excluí-la, pois isso seria ineficiente.
Um loop for simples com uma verificação hasOwnProperty deve funcionar e é muito mais adaptável às necessidades futuras:
fonte
Que tal isso? Eu nunca encontrei esse padrão, mas estava apenas tentando excluir uma ou mais propriedades sem a necessidade de criar um objeto extra. Isso parece funcionar, mas existem alguns efeitos colaterais que não consigo ver. Com certeza não é muito legível.
fonte
Consegui dessa maneira, como um exemplo do meu redutor Redux:
Em outras palavras:
fonte
const { [removeMe]: removedKey, ...newObj } = obj;
- veja minha resposta sobre esta pergunta.Eu fiz recentemente dessa maneira muito simples:
apenas usando o operador spread para separar a propriedade indesejada:
... e object.assign para pegar apenas a parte 'rest':
fonte
rest
já é um novo objeto - você não precisa da última linha. Além disso, isso é idêntico à solução aceita.fonte