[英]Typescript/Javascript Conditionally Add members to object using spread op
我正在尝试使用此处规定的方法有条件地将成员添加到 object
这是我的代码:
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。 就好像它重新创建了内部数据对象。 任何想法如何解决这个问题?
是的,这正是您所想的,这就是为什么您需要参考数据 object 的先前值的原因。
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.
};
通过在其内部传播 someobj.data,您可以确保它具有他以前的值。
在最后一行中,您将 object 的data
属性设置为新的 object, {datafield2: "hooahh"}
。
这相当于:
{
data: { a: 1 }
data: { b: 2 }
}
重复的键被覆盖,所以它变成
{
data: { b: 2 }
}
如果要将data
设置为具有自己的条件子键的单个 object,可以执行以下操作:
const test = {
...(someobj.field1 && {field1: someobj.field1}),
...(someobj.nofield && {nofield: "yowzee"}),
...(someobj.data && {data: {
...(someobj.data.datafield1 && {dataField1: "woohoo"}),
...(someobj.data.datafield2 && {dataField2: "hooahh"}),
}}),
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.