Por ejemplo, si tengo dos objetos:
var foo = { x: "bar", y: "baz" }
y
var oof = {}
y quería transferir los valores de x e y de foo a oof. ¿Hay alguna manera de hacerlo usando la sintaxis de desestructuración es6?
tal vez algo como:
oof{x,y} = foo
Si bien es feo y un poco repetitivo, puedes hacer
({x: oof.x, y: oof.y} = foo);
que leerá los dos valores del objeto foo
y los escribirá en sus ubicaciones respectivas en el objeto oof
.
Personalmente prefiero leer
oof.x = foo.x; oof.y = foo.y;
o
['x', 'y'].forEach(prop => oof[prop] = foo[prop]);
aunque.
En mi opinión, esta es la forma más fácil de lograr lo que estás buscando:
let { prop1, prop2, prop3 } = someObject; let data = { prop1, prop2, prop3 }; // data === { prop1: someObject.prop1, ... }
Básicamente, desestructurar en variables y luego usar la abreviatura del inicializador para crear un nuevo objeto. No hay necesidad de Object.assign
Creo que esta es la forma más legible, de todos modos. Por la presente, puede seleccionar los accesorios exactos de someObject
que desee. Si tiene un objeto existente en el que solo desea fusionar los accesorios, haga algo como esto:
let { prop1, prop2, prop3 } = someObject; let data = Object.assign(otherObject, { prop1, prop2, prop3 }); // Makes a new copy, or... Object.assign(otherObject, { prop1, prop2, prop3 }); // Merges into otherObject
Otra forma, posiblemente más limpia, de escribirlo es:
let { prop1, prop2, prop3 } = someObject; let newObject = { prop1, prop2, prop3 }; // Merges your selected props into otherObject Object.assign(otherObject, newObject);
Lo uso mucho para solicitudes POST
donde solo necesito algunos datos discretos. Pero estoy de acuerdo en que debería haber una sola línea para hacer esto.
EDITAR: PD: ¡recientemente aprendí que puede usar ultra desestructuración en el primer paso para extraer valores anidados de objetos complejos! Por ejemplo...
let { prop1, prop2: { somethingDeeper }, prop3: { nested1: { nested2 } } = someObject; let data = { prop1, somethingDeeper, nested2 };
Además, puede usar el operador de propagación en lugar de Object.assign al crear un nuevo objeto:
const { prop1, prop2, prop3 } = someObject; let finalObject = {...otherObject, prop1, prop2, prop3 };
O...
const { prop1, prop2, prop3 } = someObject; const intermediateObject = { prop1, prop2, prop3 }; const finalObject = {...otherObject, ...intermediateObject };
No, la desestructuración no admite expresiones de miembros en forma abreviada, sino solo nombres de propiedades sin formato en el momento actual. Ha habido conversaciones al respecto en esdiscuss, pero ninguna propuesta llegará a ES6.
Sin embargo, es posible que pueda usar Object.assign
; si no necesita todas las propiedades propias, aún puede hacerlo
var foo = …, oof = {}; { let {x, y} = foo; Object.assign(oof, {x, y}) }