Tengo un objeto como este:
const objBefore: { "id": "3pa99f64-5717-4562-b3fc-2c963f66afa1", "number": "5000", "enabled": true, "classes": [ { "id": "2fc87f64-5417-4562-b3fc-2c963f66afa4", "name": "General" }, { "id": "7ffcada8-0215-4fb0-bea9-2266836d3b18", "name": "Special" }, { "id": "6ee973f7-c77b-4738-b275-9a7299b9b82b", "name": "Limited" } ] }Usando es6, quiero tomar todo en el objeto excepto la clave de nombre de la matriz de clases internas para pasarlo a una API.
Asi que:
{ "id": "3pa99f64-5717-4562-b3fc-2c963f66afa1", "number": "5000", "enabled": true, "classes": [ {"id": "2fc87f64-5417-4562-b3fc-2c963f66afa4"}, {"id": "7ffcada8-0215-4fb0-bea9-2266836d3b18"}, {"id": "6ee973f7-c77b-4738-b275-9a7299b9b82b"} ] } Lo más cercano que obtuve fue: let {id, number, enabled, classes: [{id}]} = objBefore;
Pero solo me da una identificación en las clases. Intenté difundir arriba usando [...{id}] o [{...id}] . La misma cosa.
Me resulta difícil obtener el modelo mental correcto sobre cómo pensar en esto cuando se trata de múltiples niveles. En mi mente, cuando digo [...{id}] estoy pensando, "Quiero la propiedad id como un objeto en la matriz de clases externas, ¡pero dame cada id en la matriz!"
Claramente no estoy pensando en esto correctamente.
Lo probé usando el mapa para obtener esa parte, pero todavía tengo problemas para combinarlo con el original para producir el resultado deseado. por ejemplo:
let classIds = objBefore.classes.map(({id}) => { return { id } })(Usando la sintaxis del mapa, ¿cómo puedo desestructurar en la función las otras teclas que están un nivel más arriba?)
Para combinarlos comencé a probar cualquier cosa y todo, :
let {id, number, enabled, classIds} = {objBefore, [...classIds]} // returns undefined for allPreferiría hacerlo en una declaración. Pero si eso no es posible, ¿cuál es una forma limpia de hacerlo usando el mapa?
No puedes desestructurar y mapear al mismo tiempo de la forma en que buscas hacerlo. El objetivo principal de la asignación de desestructuración es extraer datos de una matriz/objeto y no manipular datos. En su caso, como está buscando un objeto con las mismas claves/valores que su objeto original, solo con una matriz de classes diferente, en su lugar, sugeriría crear un nuevo objeto y distribuir ... el objeto original en eso. Luego, puede sobrescribir la matriz de classes con una versión asignada de esa matriz:
const objBefore = { "id": "3pa99f64-5717-4562-b3fc-2c963f66afa1", "number": "5000", "enabled": true, "classes": [ { "id": "2fc87f64-5417-4562-b3fc-2c963f66afa4", "name": "General" }, { "id": "7ffcada8-0215-4fb0-bea9-2266836d3b18", "name": "Special" }, { "id": "6ee973f7-c77b-4738-b275-9a7299b9b82b", "name": "Limited" } ] }; const newObj = { ...objBefore, classes: objBefore.classes.map(({id}) => ({id})) }; console.log(newObj);¿Qué tal usar un método de utilidad simple con desestructuración de objetos, operador de propagación y map
const objBefore = { id: "3pa99f64-5717-4562-b3fc-2c963f66afa1", number: "5000", enabled: true, classes: [ { id: "2fc87f64-5417-4562-b3fc-2c963f66afa4", name: "General", }, { id: "7ffcada8-0215-4fb0-bea9-2266836d3b18", name: "Special", }, { id: "6ee973f7-c77b-4738-b275-9a7299b9b82b", name: "Limited", }, ], }; const process = ({ classes, ...rest }) => ({ ...rest, classes: classes.map(({ id }) => ({ id })), }); console.log(process(objBefore))En una línea, podrías hacer esto:
const objAfter = { ...objBefore, classes: objBefore.classes.map(item => ({ id: item.id })) };O, si lo prefiere:
const objAfter = {...objBefore, classes: objBefore.classes.map(({id}) => ({id}))}; No hay ninguna forma en la destrucción de objetos para copiar una matriz completa de objetos en una matriz diferente de objetos eliminando propiedades, por lo que usa .map() para eso.