1。算法实现:
待被处理的数据结构:

2.目标效果:

设计思路:
dict.setdefault(k,v),如果存在k,返回dict的k的v,否则添加{k:v}并返回他的v,
def list_to_tree(data):
i = 0
res = {}
for v in data:
v["parent_id"] = v["parent_id"] if v["parent_id"] else 0
res.setdefault(v["id"], v).update(v)
res.setdefault(v["parent_id"], {}).setdefault("children", []).append(res.get(v["id"], v))
return res[0]["children"]
实现逻辑:
先添加id为1的id,然后再加parent,如果parent_id 已存在返回它的value,再对value进行设置children,存在则添加,如果chidren也存在,返回children的value进行append,如果不存在直接加键值对再加children,
{1: {‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘}}
{1: {‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘}, 0: {‘children‘: [{‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘}]}}
然后:
{
1: {‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘},
0: {‘children‘: [
{‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘}
]
},
2: {‘id‘: 2, ‘parent_id‘: 1, ‘name‘: ‘AA‘}}
{1: {‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘, ‘children‘: [{‘id‘: 2, ‘parent_id‘: 1, ‘name‘: ‘AA‘}]},
0: {‘children‘: [{‘id‘: 1, ‘parent_id‘: 0, ‘name‘: ‘A‘, ‘children‘: [{‘id‘: 2, ‘parent_id‘: 1, ‘name‘: ‘AA‘}]}]},
2: {‘id‘: 2, ‘parent_id‘: 1, ‘name‘: ‘AA‘}}
算法应用场景:
树形目录设计表返回前端数据:
[
{
"id": 1,
"parent_id": 0,
"name": "A",
"children": [
{
"id": 2,
"parent_id": 1,
"name": "AA"
},
{
"id": 3,
"parent_id": 1,
"name": "AB",
"children": [
{
"id": 4,
"parent_id": 3,
"name": "ABA"
}
]
}
]
},
{
"id": 11,
"parent_id": 0,
"name": "A",
"children": [
{
"id": 13,
"parent_id": 11,
"name": "A"
}
]
},
{
"id": 12,
"parent_id": 0,
"name": "A",
"children": [
{
"id": 14,
"parent_id": 12,
"name": "A"
}
]
}
]
前端数据结构:
template>
<a-tree
v-model="checkedKeys"
checkable
:expanded-keys="expandedKeys"
:auto-expand-parent="autoExpandParent"
:selected-keys="selectedKeys"
:tree-data="treeData"
@expand="onExpand"
@select="onSelect"
/>
</template>
<script>
const treeData = [
{
title: ‘0-0‘,
key: ‘0-0‘,
children: [
{
title: ‘0-0-0‘,
key: ‘0-0-0‘,
children: [
{ title: ‘0-0-0-0‘, key: ‘0-0-0-0‘ },
{ title: ‘0-0-0-1‘, key: ‘0-0-0-1‘ },
{ title: ‘0-0-0-2‘, key: ‘0-0-0-2‘ },
],
},
{
title: ‘0-0-1‘,
key: ‘0-0-1‘,
children: [
{ title: ‘0-0-1-0‘, key: ‘0-0-1-0‘ },
{ title: ‘0-0-1-1‘, key: ‘0-0-1-1‘ },
{ title: ‘0-0-1-2‘, key: ‘0-0-1-2‘ },
],
},
{
title: ‘0-0-2‘,
key: ‘0-0-2‘,
},
],
},
{
title: ‘0-1‘,
key: ‘0-1‘,
children: [
{ title: ‘0-1-0-0‘, key: ‘0-1-0-0‘ },
{ title: ‘0-1-0-1‘, key: ‘0-1-0-1‘ },
{ title: ‘0-1-0-2‘, key: ‘0-1-0-2‘ },
],
},
{
title: ‘0-2‘,
key: ‘0-2‘,
},
];
设计表:
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT ‘菜单名称‘,
`code` varchar(64) NOT NULL COMMENT ‘菜单标识‘,
`url` varchar(255) NOT NULL COMMENT ‘菜单url‘,
`order_number` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘排序号‘,
`description` varchar(255) DEFAULT NULL COMMENT ‘菜单说明‘,
`parent_id` int(11) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘父级菜单ID‘,
`app_id` int(11) NOT NULL COMMENT ‘应用ID‘,
`state` tinyint(1) NOT NULL DEFAULT ‘1‘ COMMENT ‘状态 0:禁用 1:启用‘,
`icon` varchar(128) DEFAULT NULL COMMENT ‘菜单icon‘,
原文:https://www.cnblogs.com/SunshineKimi/p/15105132.html