golang
package main import ( "encoding/json" "fmt" "go_study3/sql" "strconv" "strings" ) /** 将一条记录添加到树 */ type treeNode struct { Name string Id string IsTeam bool Children *[]treeNode Position string } // result是一个列表,每个item是一个字典,如果 team = 字典["Name"] 则返回这个item func getChildrenByTeam(team string, result *[]treeNode) *[]treeNode { for _, v := range *result { if team == v.Name { return v.Children } } fmt.Println("执行到这里了") return nil } func getTeamInChildren(team string, children *[]treeNode) *treeNode { for _, child := range *children { if team == child.Name { return &child } } return nil } func getChildren(teams []string, i int, result *[]treeNode) *[]treeNode { tmp := result tmpTeams := teams[:i] for _, team := range tmpTeams { tmp = getChildrenByTeam(team, tmp) } return tmp } func addOneItem(user sql.User, result *[]treeNode) { // 出现异常了恢复 defer func() { err := recover() if err != nil { fmt.Println("ERROR,内容如下", user, err) } }() position := user.Position teams := strings.Split(strings.Trim(position, "/"), "/") children := new([]treeNode) teamStruct := new(treeNode) count := 0 for i, team := range teams { if i == 0 { children = result } else { children = getChildren(teams, i, result) } teamStruct = getTeamInChildren(team, children) // team对象 的指针 if teamStruct == nil { tmp := treeNode{ Name: team, IsTeam: true, Id: strconv.Itoa(count), Children: new([]treeNode), } teamStruct = &tmp *children = append(*children, tmp) count++ //fmt.Println(children) //fmt.Println(result) } } node := treeNode{ Name: user.Username, Id: user.Id, IsTeam: false, Children: nil, Position: user.Position, } *teamStruct.Children = append(*teamStruct.Children, node) } func main() { fmt.Println("hello") users := sql.QueryMultiRowDemo2(3000) result := make([]treeNode, 0) fmt.Printf("result = %p ", result) for _, user := range users { fmt.Println(user) if user.Position != "" { addOneItem(user, &result) } } fmt.Println(result) strByte, err := json.Marshal(result) if err != nil { fmt.Println("err", err) } else { strJson := string(strByte) fmt.Println(strJson) } }
python
""" Created by yang on 2020/10/14 dim 用户-树形结构 """ import json from test01.dbUtils import MysqlConn def get_children_by_team(team, result): """ result是一个列表,每个item是一个字典,如果 team = 字典["name"] 则返回这个item :return: """ for item in result: if team == item["name"]: return item["children"] def team_in_children(team, children): for item in children: if team == item["name"]: return True return False def get_children(teams: list, i: int, result: list): """ 寻找最内层的children 是一个list :param teams: :param i: :param result: :return: """ tmp = result tmp_teams = teams[:i] for team in tmp_teams: tmp = get_children_by_team(team, tmp) return tmp id = 0 def add_one_item(item, result: list): """ 将一条记录添加到树 :param item: :param result: :return: """ if not item["Position"]: return position = item["Position"] print(position) teams = position.strip("/").split("/") global id children = [] for i, team in enumerate(teams): if i == 0: children = result else: children = get_children(teams, i, result) if not team_in_children(team, children): tmp = { "name": team, "is_team": True, "id": id, "children": [] } children.append(tmp) id += 1 item["id"] = item.pop("Id") item["name"] = item.pop("Nickname") item["is_team"] = False children[-1]["children"].append(item) def f1(): conn = MysqlConn("200.200.84.30", "mmuser", "mostest") res = conn.execSql("select Id,Nickname,Position from `mattermost_test`.`Users` limit 10") result = [] for item in res: add_one_item(item, result) print(json.dumps(result, indent=4, ensure_ascii=False)) if __name__ == '__main__': f1()
树结构
[ { "name": "", "is_team": true, "id": 0, "children": [ { "name": "", "is_team": true, "id": 1, "children": [ { "name": "", "is_team": true, "id": 2, "children": [ { "name": "", "is_team": true, "id": 3, "children": [ { "name": "", "is_team": true, "id": 4, "children": [ { "Position": "", "id": "", "name": "", "is_team": false } ] } ] } ] }, { "name": "", "is_team": true, "id": 15, "children": [ { "name": "", "is_team": true, "id": 16, "children": [ { "name": "", "is_team": true, "id": 17, "children": [ { "Position": "", "id": "", "name": "", "is_team": false } ] } ] } ] } ] }, { "name": "", "is_team": true, "id": 5, "children": [ { "name": "", "is_team": true, "id": 6, "children": [ { "name": "", "is_team": true, "id": 7, "children": [ { "Position": "", "id": "", "name": "", "is_team": false } ] } ] } ] } ] }, { "name": "公司2", "is_team": true, "id": 8, "children": [ { "name": "", "is_team": true, "id": 9, "children": [ { "name": "", "is_team": true, "id": 10, "children": [ {