如何将省市区树结构扁平化为选中节点的代码数组?
省市区树结构扁平化转换
给了省市区的树状结构,只有选中节点的check为1,其他都为null。我们需要做的就是扁平化数据结构,把所有被选中的省、市、区代码放到一个数组中。
解决方案
思路是递归遍历树结构,将选中状态向下传递。具体步骤如下:
- 定义一个函数getCheckedList,接受树形结构list、当前路径parentList和上级是否被选中parentChecked作为参数。
- 初始化结果集result为空数组。
-
遍历list,对于每个节点:
- 计算当前节点的选中状态checked,如果上级被选中或当前被选中,则认为被选中。
- 将当前节点的code添加到当前路径中,得到新的codeList。
- 如果当前节点还有子节点,则递归调用getCheckedList,将codeList和checked向下传递。
- 如果当前节点是叶子节点,且被选中,则将codeList添加到结果集中。
- 返回结果集result。
代码示例
const getCheckedList = (list, parentList = [], parentChecked = false) => { let result = []; if (!Array.isArray(list)) { return result; } list.forEach((item) => { const checked = parentChecked || item.check; // 父级被选中或当前被选中,均认为是被选中 const codeList = parentList.concat(item.code); if (item.children) { // 当前不是最内层 result = result.concat(getCheckedList(item.children, codeList, checked)); } else { // 已到最内层 if (checked) { result.push(codeList); } } }); return result; };
使用示例:
const tree = [ { "code": "110000", "value": "北京市", "check": 1, "children": [ { "code": "110100", "value": "北京市", "check": null, "children": [ { "code": "110101", "value": "东城区", "check": null }, { "code": "110102", "value": "西城区", "checked": null } ] } ] }, /* 省略其他省市区 */ ]; const result = getCheckedList(tree); console.log(result);
结果:
[ [ "110000", "110100", "110101" ], [ "110000", "110100", "110102" ], /* 省略其他选中项 */ ]
以上就是如何将省市区树结构扁平化为选中节点的代码数组?的详细内容,更多请关注其它相关文章!