Typescript/Javascript使用spread操作有条件地向对象添加成员



我正试图使用此处规定的方法有条件地向对象添加成员

这是我的代码:

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);

除了最后一个条件覆盖data.datafield1之外,这种方法非常有效。就好像它重新创建了内部数据对象。有什么解决办法吗?

是的,这正是你所想的,这就是为什么你需要引用数据对象的前一个值。

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.
};

通过在其内部传播一些obj.data,可以确保它具有其先前的值。

在最后一行中,将对象的data属性设置为新对象{datafield2: "hooahh"}

这相当于:

{
data: { a: 1 }
data: { b: 2 }
}

重复的密钥被覆盖,因此它成为

{
data: { b: 2 }
}

如果您想将data设置为具有自己的条件子键的单个对象,可以执行以下操作:

const test = {
...(someobj.field1 &&  {field1: someobj.field1}),
...(someobj.nofield && {nofield: "yowzee"}),
...(someobj.data && {data: {
...(someobj.data.datafield1 && {dataField1: "woohoo"}),
...(someobj.data.datafield2 && {dataField2: "hooahh"}),
}}),
};

最新更新