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

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

遞歸地展平地圖golang

遞歸地展平地圖golang

Go
慕容708150 2022-12-19 18:15:24
使用下面的 json 我試圖將其展平以便于訪問。具有 2 個資源的示例在此結構中可以有 n 個"config": {    "type": "r1",    "properties": {        "p1": "10",        "p2": "10"    },    "connected": [        {            "type": "r3",            "properties": {              "p1": "10",              "p2": "10"            },            "connected": [                {}        },    ],}自定義奉承邏輯func keyValuePairs(m interface{}) map[string]interface{} {    kvs := make(map[string]interface{})    if reflect.ValueOf(m).Kind() == reflect.Map {        mp, ok := m.(map[string]interface{})        if ok {            var key string            var value interface{}            for k, v := range mp {                switch k {                case "type":                    key = v.(string)                case "properties":                    value = v                case "connected":                    if collection, ok := v.([]interface{}); ok {                        for _, c := range collection {                            for nk, nv := range keyValuePairs(c) {                                nnv, _ := nv.(map[string]interface{})                                _, ok := nnv["connectedTo"]                                if !ok {                                   nnv["connectedTo"] = key                                }                                kvs[nk] = nv                            }                        }                    }                default:                    for nk, nv := range keyValuePairs(v) {                        kvs[nk] = nv                    }                }            }            if key != "" {                kvs[key] = value            }        } else {            for k, v := range m.(map[string]interface{}) {                kvs[k] = v            }        }    }    return kvs}所需的輸出有點波動,有些運行我得到了我需要的輸出,有些執行“connectedTo”屬性為空。{"r1": {        "p1": "10",        "p2": "10"    },"r3" : {        "connectedTo": "r1",        "p1": "10",        "p2": "10"    },}我認為處決不是按順序執行的。如果我錯了,請糾正我。
查看完整描述

1 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

現在看看你的循環:


var key string

var value interface{}

for k, v := range mp {

    switch k {

    case "type":

        key = v.(string)

    case "properties":

        value = v

    case "connected":

        if collection, ok := v.([]interface{}); ok {

            for _, c := range collection {

                for nk, nv := range keyValuePairs(c) {

                    nnv, _ := nv.(map[string]interface{})

                    _, ok := nnv["connectedTo"]

                    if !ok {

                       nnv["connectedTo"] = key

                    }

                    kvs[nk] = nv

                }

            }

        }

    default:

        for nk, nv := range keyValuePairs(v) {

            kvs[nk] = nv

        }

    }

}

您正在分支中使用key變量,但是達到和"connected"的順序是不確定的(隨機的)。"type""connected"


"type"分支是設置的key,但如果"connected"先到達,則為key空。


您不能依賴地圖迭代順序。


一個簡單的解決方法是在循環之前"type"首先獲取與first 關聯的值并將其分配給key(您在"connected"分支中使用的值) 。


例如:


key, _ := mp["type"].(string)

value := mp["properties"]

// Now process other properties:

for k, v := range mp {

    switch k {

    case "type", "properties": // Already handled

    case "connected":

        if collection, ok := v.([]interface{}); ok {

            for _, c := range collection {

                for nk, nv := range keyValuePairs(c) {

                    nnv, _ := nv.(map[string]interface{})

                    _, ok := nnv["connectedTo"]

                    if !ok {

                       nnv["connectedTo"] = key

                    }

                    kvs[nk] = nv

                }

            }

        }

    default:

        for nk, nv := range keyValuePairs(v) {

            kvs[nk] = nv

        }

    }

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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