我正在寻找最佳的解决方案,以按角度更新嵌套对象内部的键值。
我知道的解决方案是手动运行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
}
});
答案 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} ))