
请问在数据库里面查询出来的列表,如何循环出这样的分组结构呢?
"manage": { "ent": { "export": true, "get": true, "plan": true } }, "oa": { "user": { "add": true, "addDept": true, "addUser": true, "get": true, "plan": true } } 用 php 可以通过循环,这样拼接,但是用 go 就玩不好了
$newList[$v['name']][$v1['name']][$v2['name']] = true 感谢!
类似这样的数据 ,
{ "id": 1, "name": "manage", "parent_id": 0, "children": [ { "id": 101, "name": "ent", "parent_id": 1, "children": [ { "id": 102, "name": "get", "parent_id": 101 }, { "id": 103, "name": "edit", "parent_id": 101 } ] } ] } 我现在的写法,但是这样有问题,这样没办法按照children分组,麻烦帮忙看看
func ruleListToObj(rules []Rule) (list map[string]map[string]map[string]bool) { root := make(map[string]map[string]map[string]bool) module := make(map[string]map[string]bool) view := make(map[string]bool) for _, v := range rules { root[v.Name] = module if len(v.Children) > 0 { for _, vv := range v.Children { module[vv.Name] = view if len(vv.Children) > 0 { for _, vvv := range v.Children { view[vvv.Name] = true } } } } } return root } 其实我就是要把数据库查出来的list,压成下面这样key value 的形式输出
{ "data": { "manage": { "ent": { "get": true, "edit": true }, "app": { "get": true, "edit": true }, "dept": { "get": true, "addDept": true, "editDept": true, "delDept": true, "addUser": true, "editUser": true, "statusUser": true }, "role": { "get": true, "add": true, "edit": true, "editAuth": true, "del": true }, "crm": { "get": true }, "log": { "get": true }, "setting": { "get": true } }, "oa": { "daily": { "get": true }, "schedule": { "get": true }, "examine": { "get": true }, "book": { "get": true } }, "bi": { "datas": { "get": true }, "visit": { "get": true } } } } 1 iamzuoxinyu 2022-05-25 19:22:02 +08:00 OP 表述能力堪忧……你这代码既看不出来有什么分组也看不出来有什么循环。 |
2 lizhien 2022-05-25 19:39:08 +08:00 不知道你想说啥,不过下面的赋值用 map 不是就可以做到吗? |
3 olddogs OP |
4/span> dcalsky 2022-05-25 20:15:19 +08:00 要先定义 struct 数据结构再解析,一直用 hashmap 可不是什么好习惯。 |
6 WintersZhang 2022-05-25 20:38:47 +08:00 相对复杂的结构不是特别适合用 map 来解析吧,实现定义好要解析的 json 相对应的 struct ,然后直接用 json 包的 Unmarshal 就可以了,类似这样: text := [你要解析的数据] type entry struct { Id int `json:"id"` Name string `json:"name"` ParentId int `json:"parent_id"` Children []entry `json:"children"` } e := entry{} json.Unmarshal([]byte(text), &e) |
7 WintersZhang 2022-05-25 20:40:51 +08:00 emmm ,才注册不久,评论不能用 markdown ,tab 缩进也会被吃掉么... 代码片段 OP 凑合看看吧 |
8 seers 2022-05-25 20:41:22 +08:00 定义一个 children struct ,然后使用 children 数组 |
9 olddogs OP @WintersZhang @seers 我想实现的是最上面的那个结构 "manage": { "ent": { "export": true, "get": true, "plan": true } }, |
10 WintersZhang 2022-05-25 20:55:40 +08:00 |
11 olddogs OP @WintersZhang 试了好久,就是不行,能帮忙研究一下嘛,多谢拉 |
12 LoNeFong 2022-05-25 21:05:51 +08:00 看起来就是一个链表 |
13 iamzuoxinyu 2022-05-25 21:45:36 +08:00 这是树状结构吧……什么奇葩设计。你是想把树状拍平么? |
14 6IbA2bj5ip3tK49j 2022-05-25 21:50:18 +08:00 哈哈,crud ,集合操作,大道至简在这儿就不太管用了。 |
15 olddogs OP @iamzuoxinyu 是的,就是打算把树状拍平,有咩有办法啊? 大佬 |
16 iamzuoxinyu 2022-05-25 21:54:10 +08:00 @olddogs 都树状了,那就递归啊……另外我不知道你的 json 数据是谁,怎么提供的,要我就喷死设计这个接口的人。 |
17 olddogs OP @iamzuoxinyu 是啊,我现在就是递归,问题是,水平有限,递归不到拍平的样子 o()o |
18 iamzuoxinyu 2022-05-25 22:04:30 +08:00 首先,按照 @WintersZhang 给出的结构反序列化。 ```go func flatten(ent *entry) []*entry { entries := make([]*entry, 0) entries = append(entries, ent) if len(ent.children) > 0 { entries = append(entries, flatten(ent.children)...) } return entries } ``` 建议补一下数据结构…… |
19 iamzuoxinyu 2022-05-25 22:06:32 +08:00 @iamzuoxinyu ```go func flatten(ent *entry) []*entry { entries := make([]*entry, 0) entries = append(entries, ent) for child := range ent.children { entries = append(entries, flatten(child)...) } return entries } ``` |
20 iamzuoxinyu 2022-05-25 22:07:41 +08:00 草,v2ex 的 markdown 机制好迷。 |
21 choury 2022-05-25 22:25:15 +08:00 定义一个结构 struct Child{ Id int `json:"id"` Name string `json:"name"` ParentId int `json:"parent_id"` Children json.RawMessage `json:"children"` } 把结果发序列化之后,把 child.Children 字段继续递归反序列化,最后存到一个数组就行了 |
22 olddogs OP @iamzuoxinyu 可能理解错了吧,我是要拍平成类似链表的感觉 |
23 iamzuoxinyu 2022-05-25 22:36:53 +08:00 @olddogs 树状怎么可能变成链表。 |
24 olddogs OP @iamzuoxinyu o()o ,好吧,看来我只能换个思路了,哎,多谢了 |
25 playniuniu 2022-05-25 23:50:50 +08:00 |
26 GeruzoniAnsasu 2022-05-26 07:20:27 +08:00 |
27 cnbattle 2022-05-26 08:19:30 +08:00 via Android List 的 key index 拼接处理成 map 的 key? |
28 GeruzoniAnsasu 2022-05-26 08:36:07 +08:00 |
29 1a7489 2022-05-26 10:14:13 +08:00 用 go 把 json 发送给 php 处理完了在返回 json |
30 MoYi123 2022-05-26 10:51:38 +08:00 能给个输入+对应的输出吗? 给了 2 个例子, 一个没输入, 一个没期望输出. 要操作树, 你肯定要会 bfs 和 dfs, 这 2 个不理解, 代码肯定不会写. |
31 tbxark 2022-05-26 19:06:10 +08:00 用这个 https://github.com/tidwall/gjson, 你的意思应该是根据 keypath 获取 value 吧 ```go package main import "github.com/tidwall/gjson" const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` func main() { value := gjson.Get(json, "name.last") println(value.String()) } ``` |
32 olddogs OP @playniuniu 不是想解析 json ,我贴 json ,是为了给看结构 |
33 olddogs OP @GeruzoniAnsasu 不是啊,其实我就是要把 sql 查出来的 List ,里面 的 key index 拼接处理成 map 的 key |
34 GeruzoniAnsasu 2022-05-27 16:28:41 +08:00 @olddogs 你贴了 4 次代码都没解释清楚源结构是什么目标结构是什么,我真的服气。 #15 > 是的,就是打算把树状拍平,有咩有办法啊? 大佬 查询出来的 list 是平坦的,你到底要从 k-v list 拼出一个树还是要把深度>1 的树平坦化成 k-v list ,至今是矛盾的。 你给了这么多示例的 json ,全完全不提表结构是什么,最后一次贴的这有上百个不同单词的 json ,你想让别人怎么心灵感应每个单词 /字段从哪来? 其实上面这么多回复,有灵性的早都可以想出来了 1. 并不需要 map[string]map[string] ....,map[string]interface{} 就足够了 2. children 这种嵌套可以用自引用模型直接在查询时查出一个嵌套的结构体 3. 你第一条附言给的数据 flatten 的代码给你了,你试了吗 4. gorm 的文档你好好看了吗,嵌套 preload 你看到了吗 |
35 GeruzoniAnsasu 2022-05-27 16:30:49 +08:00 你好像不知道你贴的所有 json 都不叫「一个列表」 |
36 lbp0200 2022-05-27 18:58:34 +08:00 巨婴伸手党,等着别人喂 |
37 olddogs OP @GeruzoniAnsasu 抱歉啊,这几天太忙了,昨天有比较急的事,搞到很晚,目标结构就是我最后一次贴的 json ,其实我现在已经换了一种方法实现了,也就是最后一次贴的代码,只是实现的比较蹩脚,我用 go 输出的树结构,然后我用 vue 拿到数据后,通过 js 的写法实现的! |
42 olddogs OP @GeruzoniAnsasu 抱歉抱歉,你写的代码我跑了的,还有上面那个老哥的也是,非常感谢能上心我的问题 |