繁体   English   中英

Typescript/Javascript 有条件地使用扩展操作将成员添加到 object

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM