用golang递归构建无限级树状目录json数据和数据库
2016-11-13 19:10
597 查看
http://studygolang.com/wr?u=http%3a%2f%2f88250.b3log.org%2fgolang-ztree
利用自我内部循环——也就是无限递归——避免之前用那种比较傻的方式:4级菜单就用4个struct嵌套。并循环for也是4层。
实现无限级struct嵌套,转成json,供treeview使用,即无限级树状菜单。
数据库结构用可以理解的传统的parentid,而不用那种left和right的树:https://segmentfault.com/q/1010000000126370/a-1020000000126714
好吧我忘了提一个很dirty的方法。
如果你的树深度是可预期的话,有个超简单的数据结构。你需要3个字段来表达这个树:
id,本节点的primary key
parent_id,其值为父节点的primary key
key,忘了学名叫啥了,你可以称为线索
level,表示当前节点到根节点的距离
其中,key字段的值为:从跟节点到父节点的primary key,中间用任意非数字符号分割。
例如以下树状结构
对应的数据库表值为:
于是,在给定一个节点d的时候,
查找d的所有子孙节点:
查找某个节点的所有子节点:
这个设计,结构非常简单。key和level是辅助字段,维护这两个字段成本很低,即使全部重建要比MPT简单多了。
yegle2.5k 声望
yegle的数据错了吧?根节点的 key应该是""
吧。查找d的所有子孙节点应该是 select * from table_name where key like "${d.key}${d.id}-%" 查找子节点应该是: select * from table_name where key like "${d.key}${d.id}-%" and level=${d.level}+1
Rory_Ye · 2014年06月28日
+1
的确,应该按照@Rory_Ye 说的才对。否则,一级节点无法查看自己的子孙节点。
faker · 6月3日
我刚去看了Modified Preorder Tree,我有疑问的是如果我添加一个字节点,那么数据库的表不是都得改?这个树和线段树类似啊。
tansumanong · 6月8日
当我没说,原来是数据库,我以为是 java web,哈哈
tansumanong · 6月8日
查询的时候用的是like,会高效吗?
play175 · 7月7日
package main import ( "encoding/json" "fmt" "os" "path/filepath" "sort" ) func main() { rootpath := "D:\\projects" root := FileNode{"projects", rootpath, []*FileNode{}} fileInfo, _ := os.Lstat(rootpath) walk(rootpath, fileInfo, &root) data, _ := json.Marshal(root) fmt.Printf("%s", data) } type FileNode struct { Name string `json:"name"` Path string `json:"path"` FileNodes []*FileNode `json:"children"` } func walk(path string, info os.FileInfo, node *FileNode) { // 列出当前目录下的所有目录、文件 files := listFiles(path) // 遍历这些文件 for _, filename := range files { // 拼接全路径 fpath := filepath.Join(path, filename) // 构造文件结构 fio, _ := os.Lstat(fpath) // 将当前文件作为子节点添加到目录下 child := FileNode{filename, fpath, []*FileNode{}} node.FileNodes = append(node.FileNodes, &child) // 如果遍历的当前文件是个目录,则进入该目录进行递归 if fio.IsDir() { walk(fpath, fio, &child) } } return } func listFiles(dirname string) []string { f, _ := os.Open(dirname) names, _ := f.Readdirnames(-1) f.Close() sort.Strings(names) return names }
利用自我内部循环——也就是无限递归——避免之前用那种比较傻的方式:4级菜单就用4个struct嵌套。并循环for也是4层。
if fio.IsDir() { walk(fpath, fio, &child) }
实现无限级struct嵌套,转成json,供treeview使用,即无限级树状菜单。
数据库结构用可以理解的传统的parentid,而不用那种left和right的树:https://segmentfault.com/q/1010000000126370/a-1020000000126714
好吧我忘了提一个很dirty的方法。
如果你的树深度是可预期的话,有个超简单的数据结构。你需要3个字段来表达这个树:
id,本节点的primary key
parent_id,其值为父节点的primary key
key,忘了学名叫啥了,你可以称为线索
level,表示当前节点到根节点的距离
其中,key字段的值为:从跟节点到父节点的primary key,中间用任意非数字符号分割。
例如以下树状结构
├── a │ ├── d │ │ ├── p │ │ ├── q │ │ └── r │ ├── e │ └── f ├── b │ ├── x │ ├── y │ └── z ├── c
对应的数据库表值为:
| id | value | parent_id | key | level | | 1 | a | 0 | "-" | 1 | | 2 | b | 0 | "-" | 1 | | 3 | c | 0 | "-" | 2 | | 4 | d | 1 | "1-" | 2 | | 5 | e | 1 | "1-" | 2 | | 6 | f | 1 | "1-" | 2 | | 7 | x | 2 | "2-" | 2 | | 8 | y | 2 | "2-" | 2 | | 9 | z | 2 | "2-" | 2 | | 10 | p | 4 | "1-4-" | 3 | | 11 | q | 4 | "1-4-" | 3 | | 12 | r | 4 | "1-4-" | 3 |
于是,在给定一个节点d的时候,
查找d的所有子孙节点:
select * from table_name where key like "${d.key}-${d.id}-%"
查找某个节点的所有子节点:
select * from table_name where key like "${d.key}-${d.id}-%" and level=${d.level}+1
这个设计,结构非常简单。key和level是辅助字段,维护这两个字段成本很低,即使全部重建要比MPT简单多了。
yegle2.5k 声望
yegle的数据错了吧?根节点的 key应该是""
吧。查找d的所有子孙节点应该是 select * from table_name where key like "${d.key}${d.id}-%" 查找子节点应该是: select * from table_name where key like "${d.key}${d.id}-%" and level=${d.level}+1
Rory_Ye · 2014年06月28日
+1
的确,应该按照@Rory_Ye 说的才对。否则,一级节点无法查看自己的子孙节点。
faker · 6月3日
我刚去看了Modified Preorder Tree,我有疑问的是如果我添加一个字节点,那么数据库的表不是都得改?这个树和线段树类似啊。
tansumanong · 6月8日
当我没说,原来是数据库,我以为是 java web,哈哈
tansumanong · 6月8日
查询的时候用的是like,会高效吗?
play175 · 7月7日
相关文章推荐
- 无限递归目录生成 json格式数据, jstree数据源
- 菜鸟笔记:node.js+mysql中将JSON数据构建为树(递归制作树状菜单数据接口)
- 自定义Qt构建步骤,添加数据文件(txt,json等)到构建目录
- 构建数据库数据的树状结构
- 用Ajax实现多级联动下拉列表For JSP(无限级别,JSON传输数据,含全国地区数据库
- 构建数据库数据的树状结构
- 构建数据库数据的树状结构
- js list数据 转 树状 层级 JSON,递归生成树状 层级 JSON
- json在将对象转换为json格式的数据的时候,出现了无限递归调用的情况
- 构建数据库数据的树状结构
- iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
- 构建数据库数据的树状结构
- json list数据递归生成树状层级JSON
- jquery前端递归打印出树状结构的多层复杂map或json键值对数据
- 构建数据库数据的树状结构
- 构建数据库数据的树状结构
- 通过数据库数据构建树结构(二)
- 使用PHP数组实现无限分类,不使用数据库,不使用递归.
- 使用silverlight构建一个工作流设计器(十六)-持久化数据到数据库—数据库结构
- 通过数据库数据构建树结构(一)