數(shù)組、對(duì)象扁平化展開

和后端合作時(shí),很多時(shí)候他們的返回?cái)?shù)據(jù)格式并不一定適合前端展示邏輯處理。其中數(shù)組和對(duì)象的嵌套問題是一個(gè)比較常見的問題。
下面就對(duì)這個(gè)情況進(jìn)行一些總結(jié)。

數(shù)組扁平化處理

后端返回格式:[1,2,3, [1,2,3, [1,2,3]]]
前端期望格式:[1,2,3,1,2,3,1,2,3]
遞歸實(shí)現(xiàn)代碼:

function flat(arr = [], result = []) {
    arr.forEach(v => {
        if(Array.isArray(v)) {
            result = result.concat(flat(v, []))
        }else {
            result.push(v)
        }
    })
    return result
}

對(duì)象扁平化處理

后端返回的格式是嵌套的,但是在AntDesign的Table組件中,表格數(shù)據(jù)要求是扁平化的,所以有了下面的處理
后端返回格式:

[{
        "step": 1,
        "errors": [{
            "resultCode": "結(jié)果",
            "subErrorInfoList": [{
                "number": 1,
                "replayErrorMarkType": 2,
            }, {

                "number": 3,
                "replayErrorMarkType": 4,

            }]
        }, {
            "resultCode": "匹配",
            "subErrorInfoList": [{

                "number": 5,
                "replayErrorMarkType": 6,

            }, {
                "number": 7,
                "replayErrorMarkType": 8,
            }]
        }, {
            "resultCode": "類型",
            "subErrorInfoList": [{
                "number": 9,
                "replayErrorMarkType": 10,
            }, {
                "number": 11,
                "replayErrorMarkType": 12,
            }]
        }, ]
    }, {
        "step": 2,
        "errors": [{
            "resultCode": "噪聲",
            "subErrorInfoList": [{
                "number": 13,
                "replayErrorMarkType": 14,
            }, {

                "number": 15,
                "replayErrorMarkType": 16,

            }]
        }, {
            "resultCode": "切面",
            "subErrorInfoList": [{

                "number": 17,
                "replayErrorMarkType": 18,

            }]
        }, {
            "resultCode": "隨意",
            "subErrorInfoList": [{
                "number": 19,
                "replayErrorMarkType": 20,
            }, {

                "number": 21,
                "replayErrorMarkType": 22,

            }]
        }, ]
    }]

前端期望格式:

[
    {
        "step": 1,
        "resultCode": "結(jié)果",
        "number": 1,
        "replayErrorMarkType": 2
    },
    {
        "step": 1,
        "resultCode": "結(jié)果",
        "number": 3,
        "replayErrorMarkType": 4
    },
    {
        "step": 1,
        "resultCode": "匹配",
        "number": 5,
        "replayErrorMarkType": 6
    },
    {
        "step": 1,
        "resultCode": "匹配",
        "number": 7,
        "replayErrorMarkType": 8
    },
    {
        "step": 1,
        "resultCode": "類型",
        "number": 9,
        "replayErrorMarkType": 10
    },
    {
        "step": 1,
        "resultCode": "類型",
        "number": 11,
        "replayErrorMarkType": 12
    },
    {
        "step": 2,
        "resultCode": "噪聲",
        "number": 13,
        "replayErrorMarkType": 14
    },
    {
        "step": 2,
        "resultCode": "噪聲",
        "number": 15,
        "replayErrorMarkType": 16
    },
    {
        "step": 2,
        "resultCode": "切面",
        "number": 17,
        "replayErrorMarkType": 18
    },
    {
        "step": 2,
        "resultCode": "隨意",
        "number": 19,
        "replayErrorMarkType": 20
    },
    {
        "step": 2,
        "resultCode": "隨意",
        "number": 21,
        "replayErrorMarkType": 22
    }
]

代碼實(shí)現(xiàn):

    const innerArr = [];

    function flatObj(arr, obj = {}) {
        arr.forEach(item => {
            if (Object.prototype.toString.call(item) === '[object Object]') {
                let flag = true;
                for (const prop in item) {
                    if (Array.isArray(item[prop])) {
                        flag = false;
                        flatObj(item[prop], obj);
                    } else {
                        obj[prop] = item[prop];
                    }
                }
                flag && innerArr.push(JSON.parse(JSON.stringify(obj)));
            }
        });
    }
    flatObj(data);
    console.log(innerArr);

總結(jié)

上述扁平化處理都采用了遞歸的思想實(shí)現(xiàn)的。希望能給有此需要的人一點(diǎn)啟發(fā)。

參考:https://juejin.im/post/5d7f2ddde51d4561ba48fe8c?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com#heading-12

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容