如何將省市區(qū)三級樹狀結(jié)構(gòu)數(shù)據(jù)扁平化處理并根據(jù)選中狀態(tài)精簡結(jié)果?

將省市區(qū)三級樹狀結(jié)構(gòu)數(shù)據(jù)扁平化處理,并根據(jù)選中狀態(tài)精簡結(jié)果

本文介紹如何將省市區(qū)三級樹狀結(jié)構(gòu)數(shù)據(jù)扁平化,并根據(jù)選中狀態(tài)精簡結(jié)果。原始數(shù)據(jù)采用樹形結(jié)構(gòu),包含省份、城市和區(qū)縣信息及選中狀態(tài)(checked: 1 表示選中)。目標是生成一個扁平化結(jié)構(gòu),僅包含必要的區(qū)域代碼和層級信息。

原始數(shù)據(jù)示例:

[   {     "code": "110000",     "value": "北京市",     "checked": "1",     "children": [       {         "code": "110100",         "value": "北京市",         "checked": "1",         "children": [           { "code": "110101", "value": "東城區(qū)", "checked": "1" },           { "code": "110102", "value": "西城區(qū)", "checked": "1" }         ]       }     ]   },   {     "code": "120000",     "value": "天津市",     "checked": "1",     "children": [       {         "code": "120100",         "value": "天津市",         "checked": "1",         "children": [           { "code": "120101", "value": "和平區(qū)", "checked": "0" },           { "code": "120102", "value": "河東區(qū)", "checked": "1" }         ]       }     ]   } ]

目標扁平化結(jié)構(gòu):

如果所有三級區(qū)域都被選中,則只保留一級和二級區(qū)域代碼;如果所有二級區(qū)域都被選中,則只保留一級區(qū)域代碼;如果三級區(qū)域只選中部分,則保留一級、二級和三級區(qū)域代碼。

[   {     "provinceAreald": "110000",     "cityAreald": null,     "countryAreald": null,     "actualAreaLevel": "1"   },   {     "provinceAreald": "120000",     "cityAreald": "120100",     "countryAreald": "120102",     "actualAreaLevel": "3"   } ]

JavaScript 函數(shù)實現(xiàn):

以下 JavaScript 函數(shù) flattenData 實現(xiàn)數(shù)據(jù)扁平化:

function flattenData(data) {   const result = [];    function processNode(node, parent) {     if (node.checked === "1") {       const item = {         provinceAreald: parent ? parent.code : node.code,         cityAreald: null,         countryAreald: null,         actualAreaLevel: '1'       };        if (node.children) {         const allChildrenChecked = node.children.every(child => child.checked === "1");         if (allChildrenChecked) {           item.actualAreaLevel = node.children[0].children ? '2' : '1';           if(node.children[0].children){             item.cityAreald = node.children[0].code;           }         } else {           item.actualAreaLevel = '2';           item.cityAreald = node.code;           for (const child of node.children) {             processNode(child, item);           }           return;         }       }        result.push(item);     } else if (node.children) {       for (const child of node.children) {         processNode(child, node);       }     }   }    for (const node of data) {     processNode(node);   }    return result; }  // 示例用法 const data = [/* ...原始數(shù)據(jù) ... */]; const flattenedData = flattenData(data); console.log(flattenedData);

此函數(shù)采用遞歸方式處理樹形結(jié)構(gòu),根據(jù)選中狀態(tài)和子節(jié)點的選中情況,動態(tài)調(diào)整actualAreaLevel和cityAreald, countryAreald字段的值,最終生成精簡的扁平化數(shù)據(jù)。 代碼也進行了優(yōu)化,減少了不必要的函數(shù)嵌套,提高了可讀性和效率。

如何將省市區(qū)三級樹狀結(jié)構(gòu)數(shù)據(jù)扁平化處理并根據(jù)選中狀態(tài)精簡結(jié)果?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊6 分享