亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從地圖生成 json 格式的樹(父子級)

如何從地圖生成 json 格式的樹(父子級)

Go
天涯盡頭無女友 2022-09-12 20:32:52
我想要什么?從地圖中獲取 JSON 格式的樹。要使用的數據:映射(鍵值對),將鍵作為父項,以各自的值作為子項法典:下面的代碼使用示例數據,我想稍后使用大數據意味著有更多的父子。如何從地圖構建父子級?如果我需要任何其他信息來將地圖數據解析為樹結構,請告訴我?type Nodes struct  {      fn string      children []*Nodes}func main() {    var m map[string][]string    m = make(map[string][]string)    //map of parents(key) and child(values)    m["root_node"] = []string{"1","2","3","4"}    m["1"] = []string{"5","6"}    m["2"] = []string{"7"}    m["3"] = []string{"8", "9"}    m["5"] = []string{"10"}    m["7"] = []string{"11"}    m["8"] = []string{"12","13"}//json format: I don't know how to get root_node so expected result can be achievedbytes, err := json.Marshal(root_node)if err != nil {    log.Fatal(err)}}我的期望:{   "Funcname": "root_node",   "Nodes": [      {         "Funcname": "1",         "Nodes": [            {               "Funcname": "5",               "Nodes": [                  {                     "Funcname": "10",                     "Nodes": null                  }               ]            },            {               "Funcname": "6",               "Nodes": null            }         ]      },      {         "Funcname": "2",         "Nodes": [            {               "Funcname": "7",               "Nodes": [                  {                     "Funcname": "11",                     "Nodes": null                  }               ]            }         ]      },      {         "Funcname": "3",         "Nodes": [            {               "Funcname": "8",               "Nodes": [                  {                     "Funcname": "12",                     "Nodes": null                  },                  {                     "Funcname": "13",                     "Nodes": null                  }               ]            },            {               "Funcname": "9",               "Nodes": null            }         ]      },      {         "Funcname": "4",         "Nodes": null      }   ]}
查看完整描述

2 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

更簡單的方法

我們也可以說這是更簡潔的方法,用構造函數語法構造節點。


type Node struct {

    Name     string

    Children []*Node

}


func first_example() {

    root := Node{

        Name: "1",

        Children: []*Node{

            {

                Name: "3",

                Children: []*Node{

                    {

                        Name: "5",

                    },

                },

            },

        },

    }


    bytes, err := json.Marshal(root)

    if err != nil {

        panic(err)

    }


    fmt.Println(string(bytes))

}

更難的方法

輸出是相同的,但它更加動態,并允許您存儲其他值,另一方面,遍歷樹更煩人,因為您必須始終投射所有內容。


func second_example() {

    root := map[string]interface{}{

        "Name": "1",

        "Children": []map[string]interface{}{

            {

                "Name": "3",

                "Children": []map[string]interface{}{

                    {

                        "Name": "5",

                    },

                },

            },

        },

    }


    bytes, err := json.Marshal(root)

    if err != nil {

        panic(err)

    }


    fmt.Println(string(bytes))

}

輸出

{"Name":"1","Children":[{"Name":"3","Children":[{"Name":"5","Children":null}]}]} // #1

{"Children":[{"Children":[{"Name":"5"}],"Name":"3"}],"Name":"1"} // #2

編輯

此外,這里還有向結構中插入節點的函數。如果操作失敗,則返回 False。


func (n *Node) InsertNode(path string, o *Node) bool {

    parts := strings.Split(path, " ")

    target := n

    for _, part := range parts {

        found := false

        for _, child := range target.Children {

            if child.Name == part {

                target = child

                found = true

                break

            }

        }

        if !found {

            return false

        }

    }


    target.Children = append(target.Children, o)

    return true

}


func third_example() {

    root := &Node{Name: "1"}

    root.Children = append(root.Children, &Node{Name: "3"})

    root.InsertNode("3", &Node{Name: "5"})


    bytes, err := json.Marshal(root)

    if err != nil {

        panic(err)

    }


    fmt.Println(string(bytes))

}


查看完整回答
反對 回復 2022-09-12
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

首先用方法定義一個類型 -NodeAddChild()


type Node struct {

    Fn       string  `json:"Funcname"`

    Children []*Node `json:"Nodes"`

}


func (node *Node) AddChild(child *Node) {

    node.Children = append(node.Children, child)

}

一個構造函數,用于為給定構造一個新節點fn -


func CreateNewNode(fn string) *Node {

    newNode := new(Node)

    newNode.Fn = fn

    return newNode

}

要從映射生成樹定義函數,如下所示 -MakeTreeFromMap()


// MakeTreeFromMap generates a tree from given map and returns pointer to root node of tree.

func MakeTreeFromMap(treeMap map[string][]string, rootNodeFn string) *Node {

    cache := make(map[string]*Node)

    for fn, children := range treeMap {

        if _, nodeExists := cache[fn]; !nodeExists {

            node := CreateNewNode(fn)

            cache[fn] = node

        }

        for _, childFn := range children {

            if _, childExists := cache[childFn]; !childExists {

                child := CreateNewNode(childFn)

                cache[childFn] = child

            }

            cache[fn].AddChild(cache[childFn])

        }

    }

    return cache[rootNodeFn]

}

將樹序列化為 JSON -


root_node := MakeTreeFromMap(m, "root_node")

bytes, err := json.Marshal(root_node)

if err != nil {

    log.Fatal(err)

}


查看完整回答
反對 回復 2022-09-12
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號