Estoy tratando de agregar miembros condicionalmente a un objeto usando el método prescrito aquí
Aquí está mi código:
const theobj = { field1: "hello", field2: 1, data: { datafield1: "world", datafield2: 2 }, field3: "yowzee" }; let someobj: any; someobj = theobj; const test = { ...(someobj.field1 && {field1: someobj.field1}), ...(someobj.nofield && {nofield: "yowzee"}), ...(someobj.data?.datafield1 && {data: {dataField1: "woohoo"}}), ...(someobj.data?.datafield2 && {data: {datafield2: "hooahh"}}), // overwrites the above }; console.log(test);Esto funciona muy bien, excepto que el último condicional sobrescribe data.datafield1. Es como si recreara los objetos de datos internos. Alguna idea de cómo resolver esto?
En esa última línea, está configurando la propiedad de data del objeto en un nuevo objeto, {datafield2: "hooahh"} .
Eso sería el equivalente a:
{ data: { a: 1 } data: { b: 2 } }las claves duplicadas se anulan, por lo que se convierte en
{ data: { b: 2 } } Si desea establecer data en un solo objeto con sus propias subclaves condicionales, puede hacerlo:
const test = { ...(someobj.field1 && {field1: someobj.field1}), ...(someobj.nofield && {nofield: "yowzee"}), ...(someobj.data && {data: { ...(someobj.data.datafield1 && {dataField1: "woohoo"}), ...(someobj.data.datafield2 && {dataField2: "hooahh"}), }}), };Sí, está sucediendo exactamente lo que está pensando, es por eso que necesita una referencia de un valor anterior del objeto de datos.
const test = { ...(someobj.field1 && { field1: someobj.field1 }), ...(someobj.nofield && { nofield: "yowzee" }), ...(someobj.data.datafield1 && { data: { dataField1: "woohoo" }}), ...(someobj.data.datafield2 && { data: { ...someobj.data, datafield2: "hooahh" }}), // doesn't overwrites the above. };Al distribuir someobj.data dentro de sí mismo, se asegura de que tenga su valor anterior.