go - 在 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)
}
解决方案
推荐阅读
- python - 美元金额,千位以逗号分隔
- python - 'NoneType' 对象不能用装饰器类调用
- django - 如何使用包含将上下文传递给 Django 模板?
- javascript - 来自 Url.Action 的动态重定向
- c# - Xamarin 形成 UWP 静默打印
- python - Python 输入和函数
- c++ - boost::asio::spawn 和 socket::async_receive_from 导致程序崩溃
- powershell - 使用带有 -AND 条件和 2 个变量的 if 语句时出错
- xamarin - 如何解决 Xamarin.Forms.Platform.Android.ListViewAdapter.IsEnabled 异常?
- c# - 为什么 MessageQueue.Send(x) 会在本地私有队列上静默失败?