开发者问题收集

在打字稿中更新对象内的嵌套对象

2020-07-03
2621

我正在寻找最佳解决方案来更新角度嵌套对象内的键值。

我知道的解决方案是手动运行 2 个 for 循环并更新每个属性。

以下是我尝试过的以及我想要实现的目标。

有没有什么选项可以避免最终运行 2 个循环?

我原本想在循环内使用 map 选项,但没有得到我期望的结果。

obj1 = [
   {
      "val":"type1",
      "removed":"N",
      "data":[
         {
            "label":"type1-a",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"N",
            "dataid":26
         }
      ]
   },
   {
      "val":"type2",
      "removed":"N",
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   }
]


Result = 

obj1 = [
   {
      "val":"type1",
      "removed":"N",
      "data":[
         {
            "newlabel":"type1-a",
            "removed":"N",
            "newid":16,
            "extraparam1":null
         },
         {
            "newlabel":"type1-b",
            "removed":"N",
            "newid":26,
            "extraparam1":null
         }
      ]
   },
   {
      "val":"type2",
      "removed":"N",
      "data":[
         {
            "newlabel":"type2-a",
            "removed":"N",
            "newid":12,
             "extraparam1":null
         },
         {
            "newlabel":"type2-b",
            "removed":"N",
            "newid":34,
            "extraparam1":null
         }
      ]
   }
]

obj1.forEach(val=>{

if(val.data){
 //logic to modify the existing object
}

});
2个回答

如果您想保留主对象而不进行任何更改。您可以执行以下操作:

const obj1 = [
    {
        "val":"type1",
        "removed":"N",
        "data":[
            {
                "label":"type1-a",
                "removed":"N",
                "dataid":16
            },
            {
                "label":"type1-b",
                "removed":"N",
                "dataid":26
            }
        ]
    },
    {
        "val":"type2",
        "removed":"N",
        "data":[
            {
                "label":"type2-a",
                "removed":"N",
                "dataid":12
            },
            {
                "label":"type2-b",
                "removed":"N",
            "dataid":34
            }
        ]
    }]
;

let result = obj1.map(({ data, ...values }) => {
    return {
        ...values,
        data: data.map(({ label, dataid, ...rest }) => ({
            ...rest,
            newlabel: label,
            newid: dataid,
            extraparam1: null
        }))
    }
})

这种方法将返回该对象的新干净副本。

但是如果您想更新该对象。您可以执行以下操作:

obj1.forEach(val => {
    if (val.data) {
        val.data = val.data.map(({ label, dataid, ...rest }) => ({
            ...rest,
            newlabel: label,
            newid: dataid,
            extraparam1: null
        }))
    }
});
Sebastian Puchet
2020-07-03

尝试一下

obj1.map(data => ({label:data.label, dataid:data.dataid, removed:data.removed, param: null} ))
Dewanshu
2020-07-03