Por exemplo, se eu tiver dois objetos:
var foo = {
x: "bar",
y: "baz"
}
e
var oof = {}
e eu queria transferir os valores xey de foo para oof. Existe uma maneira de fazer isso usando a sintaxe de desestruturação es6?
talvez algo como:
oof{x,y} = foo
javascript
ecmascript-6
destructuring
majorBummer
fonte
fonte
Object.assign(oof, foo)
Object.assign
Respostas:
Enquanto feio e um pouco repetitivo, você pode fazer
que lerá os dois valores do
foo
objeto e os gravará em seus respectivos locais nooof
objeto.Pessoalmente, eu ainda prefiro ler
ou
Apesar.
fonte
var oof = {};
.({x: oof.x, y: oof.y} = foo)
? Eu acho que você colocou um f extra no oof .Não, a desestruturação não suporta expressões de membros em atalhos, mas apenas nomes de propriedades simples no momento atual. Houve conversas sobre esse assunto no esdiscuss, mas nenhuma proposta chegará ao ES6.
Object.assign
No entanto, você pode usar - se não precisar de todas as propriedades, ainda poderá fazerfonte
--harmony_destructuring
ativado. Eu vejo "SyntaxError: token inesperado".{oof.x, oof.y} = foo
. Ou talvez eu realmente tivesse perdido.Na IMO, essa é a maneira mais fácil de realizar o que você está procurando:
Basicamente, desestruture em variáveis e use a abreviação do inicializador para criar um novo objeto. Não há necessidade de
Object.assign
Eu acho que essa é a maneira mais legível, de qualquer maneira. Você pode selecionar os adereços exatos
someObject
que deseja. Se você já possui um objeto no qual deseja mesclar os objetos, faça algo assim:Outra maneira, sem dúvida mais limpa, de escrevê-lo é:
Eu uso muito isso para
POST
solicitações em que preciso apenas de alguns dados discretos. Mas, eu concordo que deve haver uma linha para fazer isso.EDIT: PS - Eu aprendi recentemente que você pode usar a ultra-desestruturação na primeira etapa para extrair valores aninhados de objetos complexos! Por exemplo...
Além disso, você pode usar o operador spread em vez do Object.assign ao criar um novo objeto:
Ou...
fonte
Além
Object.assign
da sintaxe de propagação do objeto, que é uma proposta do Estágio 2 para ECMAScript.Mas, para usar esse recurso, você precisa usar
stage-2
outransform-object-rest-spread
plug-in para o babel. Aqui está uma demonstração sobre babel comstage-2
fonte
Plugin BabelJS
Se você estiver usando o BabelJS, agora poderá ativar meu plug-in
babel-plugin-transform-object-from-destructuring
( consulte o pacote npm para instalação e uso ).Eu tive o mesmo problema descrito neste tópico e, para mim, foi muito desgastante quando você cria um objeto a partir de uma expressão destruturante, especialmente quando é necessário renomear, adicionar ou remover uma propriedade. Com este plug-in, manter esses cenários fica muito mais fácil para você.
Exemplo de objeto
pode ser escrito como:
Exemplo de matriz
pode ser escrito como:
fonte
let myTest = { test1, test3 } = myObject;
não funcionaÉ totalmente possível. Apenas não em uma declaração.
(Observe os parênteses em torno da declaração.) Mas lembre-se de que a legibilidade é mais importante do que o código de golfe :).
Fonte: http://exploringjs.com/es6/ch_destructuring.html#sec_assignment-targets
fonte
Você pode apenas usar a reestruturação para isso assim:
Ou mescle os dois objetos se oof tiver valores:
fonte
oof = {...oof, ...foo}
Você pode retornar o objeto destruído em uma função de seta e usar Object.assign () para atribuí-lo a uma variável.
fonte
SECO
ou
fonte
Você pode destruir um objeto atribuindo diretamente a outro atributo do objeto.
Exemplo de trabalho:
Você pode trabalhar com a destruição usando variáveis com o mesmo nome de atributo de objeto que deseja capturar, desta forma não é necessário:
Use desta maneira:
Da mesma maneira que você pode definir novos valores para estruturas de objetos, se eles tiverem o mesmo nome de atributo.
Veja este exemplo de trabalho:
fonte
Isso funciona no chrome 53.0.2785.89
fonte
oof
apenas recebe uma referênciafoo
e ignora toda a desestruturação (pelo menos no Chrome).oof === foo
elet oof = { x } = foo
ainda retorna{ x, y }
Eu vim com este método:
Que você pode usar assim:
ou seja, você pode escolher quais propriedades deseja e colocá-las em um novo objeto. Ao contrário,
_.pick
você também pode renomeá-los ao mesmo tempo.Se você deseja copiar os objetos em um objeto existente, basta definir o
dest
argumentofonte
Isso é meio que trapaça, mas você pode fazer algo assim ...
Na prática, acho que você raramente iria querer usar isso. O que se segue é MUITO mais claro ... mas não tão divertido.
Outra rota completamente diferente, que inclui sujeira com o protótipo (cuidado agora ...):
fonte
Esta é a solução mais legível e mais curta que eu poderia encontrar:
Irá produzir
{ isValidDate: 'yes' }
Seria bom algum dia poder dizer algo como,
let newProps = ({ isValidDate } = props)
mas infelizmente não é algo que o ES6 suporte.fonte
Não é uma maneira bonita, nem eu recomendo, mas é possível assim, apenas pelo conhecimento.
fonte
Você pode usar métodos de classe JSON para alcançá-lo da seguinte maneira
Passe as propriedades que precisam ser adicionadas ao objeto resultante como segundo argumento para
stringify
funcionar em um formato de matriz.Documento MDN para JSON.stringify
fonte