在打字稿中更新对象内的嵌套对象
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