首页 > 解决方案 > 在 Golang 中重新排序地图

问题描述

假设 JSON 对象是

[map[id:id_1
     fname:Form Factor
     ffname:Smartphone
     fuid:fid_1]
 map[fname:Form Factor
     ffname:Feature Phone
     fuid:fid_2
     id:id_1]
 map[id:id_2
     fname:Operating
     System ffname:Android
     fuid:fid_3]
 map[id:id_3
     ffname:Test
     fuid:fid_3
     fname:TestUpdated]
]

如果我需要将此映射转换为具有相似 id 值的元素被合并。fuid 和 ffname 也被组合为一个嵌套映射,其中包含一个可能被索引的新键

[map[id:id_1
     fname:Form Factor
     newkey[1]:{fuid:fid_1 ffname:Smartphone}
     newkey[2]:{fuid:fid_2 ffname:Feature Phone}]
 map[id:id_2
     fname:Operating System
     ffname:Android fuid:fid_3]
 map[id:id_3
     ffname:Test
     fuid:fid_3
     fname:TestUpdated
}

需要进行哪些更改?

相关链接 在 Golang 中合并地图

谢谢

给出结果的最少代码。但肯定有更好的方法来做到这一点..

    func reorder() {
        fdata, err := getData()
        if err != nil {
            fmt.Println(err)
        }
        var a ([]map[string]interface{})
        err = json.Unmarshal(fdata, &a)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println(a)

        type f1 struct {
            id   interface{}
            fname interface{}
        }

        type f2 struct {
            fid        interface{}
            ffname interface{}
        }

        type f3 struct {
            f1 struct {
                id   interface{}
                fname interface{}
            }
            f2 struct {
                fid        interface{}
                ffname interface{}
            }
        }

        c := make(map[int]*f3, 0)

        var d *f3
        for l, p := range a {

            d = &f3{
                f1: struct {
                    id   interface{}
                    fname interface{}
                }{
                    id:   p["id"],
                    fname: p["fname"],
                },
                f2: struct {
                    fid        interface{}
                    ffname interface{}
                }{
                    fid:        p["fid"],
                    ffname: p["ffname"],
                },
            }

            c[l] = d

        }

        e := make(map[f1][]map[int]f2)
        for _, h := range c {
            for o, k := range c {
                if h.f1.id == k.f1.id {
                    if h.f2.fid != k.f2.fid {
                        e[h.f1] = append(e[h.f1], map[int]f2{
                            o: k.f2,
                        })

                        fmt.Println(e)
                    }
                } else {
                    if o == 0 {
                        var g []map[int]f2
                        g = append(g, map[int]f2{
                            o: k.f2,
                        })
                        e[h.f1] = g
                    }
                }
            }
        }
    fmt.Println("final transformed map..")
    fmt.Println(e)

}

标签: gomergemaps

解决方案


推荐阅读