更新打字稿中的嵌套对象

时间:2020-07-03 01:08:49

标签: javascript arrays typescript

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

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

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

有没有其他选择可以避免最终运行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 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

尝试一下

obj1.map(data => ({label:data.label, dataid:data.dataid, removed:data.removed, param: null} ))