第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

Go
天涯盡頭無女友 2022-09-12 20:32:52
我想要什么?從地圖中獲取 JSON 格式的樹。要使用的數(shù)據(jù):映射(鍵值對),將鍵作為父項(xiàng),以各自的值作為子項(xiàng)法典:下面的代碼使用示例數(shù)據(jù),我想稍后使用大數(shù)據(jù)意味著有更多的父子。如何從地圖構(gòu)建父子級?如果我需要任何其他信息來將地圖數(shù)據(jù)解析為樹結(jié)構(gòu),請告訴我?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貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個贊

更簡單的方法

我們也可以說這是更簡潔的方法,用構(gòu)造函數(shù)語法構(gòu)造節(jié)點(diǎn)。


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))

}

更難的方法

輸出是相同的,但它更加動態(tài),并允許您存儲其他值,另一方面,遍歷樹更煩人,因?yàn)槟仨毷冀K投射所有內(nèi)容。


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

編輯

此外,這里還有向結(jié)構(gòu)中插入節(jié)點(diǎn)的函數(shù)。如果操作失敗,則返回 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))

}


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

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超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)

}

一個構(gòu)造函數(shù),用于為給定構(gòu)造一個新節(jié)點(diǎn)fn -


func CreateNewNode(fn string) *Node {

    newNode := new(Node)

    newNode.Fn = fn

    return newNode

}

要從映射生成樹定義函數(shù),如下所示 -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)

}


查看完整回答
反對 回復(fù) 2022-09-12
  • 2 回答
  • 0 關(guān)注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號