繁体   English   中英

在 typescript 中的 object 中更新嵌套的 object

[英]update nested object inside object in typescript

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

我知道的解决方案是手动运行 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 } });

如果要保持主 object 不变。 你可以这样做:

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

此方法将返回 object 的新干净副本。

但是如果你想更新 object。 你可以这样做:

obj1.forEach(val => {
    if (val.data) {
        val.data = val.data.map(({ label, dataid, ...rest }) => ({
            ...rest,
            newlabel: label,
            newid: dataid,
            extraparam1: null
        }))
    }
});

尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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