项目作者: shann09

项目描述 :
list->tree js/cljs lib,work with ant design's Table or Tree. 用clojurescript写的js库,根据list中元素的id和parentId等字段把list转换为tree,获取tree中的子孙节点、祖先节点、兄弟节点、上下兄弟节点等。
高级语言: Clojure
项目地址: git://github.com/shann09/ztree.git
创建时间: 2017-08-25T03:12:34Z
项目社区:https://github.com/shann09/ztree

开源协议:

下载


ztree

用clojurescript写的js库,根据list中元素的id和parentId等字段把list转换为tree,获取tree中的子孙节点、祖先节点、兄弟节点、上下兄弟节点等

可以用js调用,也可以被clojurescript调用,源码稍作修改也可以被clojure调用

可用于配合蚂蚁金服(antd)的Table和Tree组件使用。

list->tree js/cljs lib,work with ant design’s Table or Tree.

当前版本

npm:

[“cl-js-ztree”: “^1.3.2”]

使用文档

编译:

  1. lein clean;lein cljsbuild auto dev;
  2. lein clean;lein cljsbuild once min;

查看:

  1. 在浏览器中打开tree.html,打开console查看打印结果
  2. 示例树的层级结构如下:
  3. 0
  4. / \
  5. 1 2
  6. /|\ / \
  7. 3 8 4 5 7
  8. |
  9. 6

js: 参考tree.html

  1. 导入
  2. html的<script>引入js,请反注释^:export,注释掉(aset js/exports k f),然后编译,再引入
  3. commonjs导入依赖,请增加依赖 "cl-js-ztree": "^x.x.x",然后import ztree from 'cl-js-ztree';
  4. 具体细节,参考下面的"打包成依赖库"
  5. ;创建一棵树,
  6. ; 第一个参数[id字段 父节点id字段 排序字段 子节点字段]是定义树的结构,
  7. ; 3个可根据list中字段名称灵活定义,子节点字段可以指定生成的json-tree的子节点字段名称
  8. ; 第二个参数是所有节点组成的list
  9. var tree = ztree.create_js_tree(
  10. ["key","parentKey","sortNum","children"],
  11. [
  12. { "key": "3" ,"parentKey": "1" ,"sortNum": 3, "name": "d"},
  13. { "key": "7" ,"parentKey": "2" ,"sortNum": 7, "name": "h"},
  14. { "key": "4" ,"parentKey": "1" ,"sortNum": 8 ,"name": "e"},
  15. { "key": "0" ,"parentKey": null ,"sortNum": 0 ,"name": "a"},
  16. { "key": "6" ,"parentKey": "5" ,"sortNum": 6, "name": "g"},
  17. { "key": "2" ,"parentKey": "0" ,"sortNum": 2, "name": "c"},
  18. { "key": "1" ,"parentKey": "0" ,"sortNum": 1, "name": "b"},
  19. { "key": "5" ,"parentKey": "2" ,"sortNum": 5, "name": "f"},
  20. { "key": "8" ,"parentKey": "1" ,"sortNum": 3, "name": "i"},
  21. ]);
  22. ;ztree.get_raw
  23. ;返回list,获取原始list
  24. console.log("raw",ztree.get_raw(tree));
  25. ;ztree.get_treelike
  26. ;返回list,获取排序后的list,按层级和sortNum排序,这是一个中间结果,其他api都是基于这个中间结果计算出来的
  27. console.log("treelike",ztree.get_treelike(tree));
  28. ;ztree.get_tree
  29. ;返回tree,获取真正的tree,即树形的json
  30. console.log("full-tree",ztree.get_tree(tree));
  31. ;ztree.pluck_descendant
  32. ;返回list,获取指定nkey的节点及其所有子孙节点,直到叶子节点,不重复
  33. console.log("descendant 1",ztree.pluck_descendant(tree,["1"]));
  34. console.log("descendant 1 5",ztree.pluck_descendant(tree,["1","5"]));
  35. ;ztree.pluck_ancestors
  36. ;返回list,获取指定nkey的节点及其所有父辈节点,直到根节点,不重复
  37. console.log("ancestors 5",ztree.pluck_ancestors(tree,["5"]));
  38. console.log("ancestors 5 7",ztree.pluck_ancestors(tree,["5","7"]));
  39. ;ztree.pluck_survivors
  40. ;返回list,获取(指定nkey的节点及其所有子孙节点)以外的所有节点,即所有节点和descendant的差集
  41. console.log("survivors 2",ztree.pluck_survivors(tree,["2"]));
  42. console.log("survivors 2 4",ztree.pluck_survivors(tree,["2","4"]));
  43. ;ztree.pluck_siblings
  44. ;返回list,获取指定1key的节点及其所有兄弟节点,不含子孙节点
  45. console.log("siblings 100",ztree.pluck_siblings(tree,"100"));
  46. console.log("siblings 0",ztree.pluck_siblings(tree,"0"));
  47. console.log("siblings 3",ztree.pluck_siblings(tree,"3"));
  48. console.log("siblings 6",ztree.pluck_siblings(tree,"6"));
  49. ;ztree.pluck_prenext
  50. ;返回长度为3list,获取指定1key的节点及其前后2个兄弟节点,[前一个兄弟, 自己, 下一个兄弟],如果没有对应兄弟,则对应位置会是null
  51. console.log("prenext 6",ztree.pluck_prenext(tree,"6"));
  52. console.log("prenext 4",ztree.pluck_prenext(tree,"4"));
  53. console.log("prenext 0",ztree.pluck_prenext(tree,"0"));
  54. console.log("prenext 8",ztree.pluck_prenext(tree,"8"));
  55. ;ztree.find
  56. ;返回object,获取指定1key的节点
  57. console.log("find 6",ztree.find(tree,"6"));
  58. 输出如下:
  59. raw-list [
  60. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  61. {"key":"7","parentKey":"2","sortNum":7,"name":"h"},
  62. {"key":"4","parentKey":"1","sortNum":8,"name":"e"},
  63. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  64. {"key":"6","parentKey":"5","sortNum":6,"name":"g"},
  65. {"key":"2","parentKey":"0","sortNum":2,"name":"c"},
  66. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  67. {"key":"5","parentKey":"2","sortNum":5,"name":"f"},
  68. {"key":"8","parentKey":"1","sortNum":3,"name":"i"}]
  69. treelike [
  70. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  71. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  72. {"key":"2","parentKey":"0","sortNum":2,"name":"c"},
  73. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  74. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  75. {"key":"5","parentKey":"2","sortNum":5,"name":"f"},
  76. {"key":"7","parentKey":"2","sortNum":7,"name":"h"},
  77. {"key":"4","parentKey":"1","sortNum":8,"name":"e"},
  78. {"key":"6","parentKey":"5","sortNum":6,"name":"g"}]
  79. full-tree [
  80. {"key":"0","parentKey":null,"sortNum":0,"name":"a","children":[
  81. {"key":"1","parentKey":"0","sortNum":1,"name":"b","children":[
  82. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  83. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  84. {"key":"4","parentKey":"1","sortNum":8,"name":"e"}]},
  85. {"key":"2","parentKey":"0","sortNum":2,"name":"c","children":[
  86. {"key":"5","parentKey":"2","sortNum":5,"name":"f","children":[
  87. {"key":"6","parentKey":"5","sortNum":6,"name":"g"}]},
  88. {"key":"7","parentKey":"2","sortNum":7,"name":"h"}]}]}]
  89. descendant 1 [
  90. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  91. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  92. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  93. {"key":"4","parentKey":"1","sortNum":8,"name":"e"}]
  94. descendant 1 5 [
  95. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  96. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  97. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  98. {"key":"4","parentKey":"1","sortNum":8,"name":"e"},
  99. {"key":"5","parentKey":"2","sortNum":5,"name":"f"},
  100. {"key":"6","parentKey":"5","sortNum":6,"name":"g"}]
  101. ancestors 5 [
  102. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  103. {"key":"2","parentKey":"0","sortNum":2,"name":"c"},
  104. {"key":"5","parentKey":"2","sortNum":5,"name":"f"}]
  105. ancestors 5 7 [
  106. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  107. {"key":"2","parentKey":"0","sortNum":2,"name":"c"},
  108. {"key":"5","parentKey":"2","sortNum":5,"name":"f"},
  109. {"key":"7","parentKey":"2","sortNum":7,"name":"h"}]
  110. survivors 2 [
  111. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  112. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  113. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  114. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  115. {"key":"4","parentKey":"1","sortNum":8,"name":"e"}]
  116. survivors 2 4 [
  117. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  118. {"key":"1","parentKey":"0","sortNum":1,"name":"b"},
  119. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  120. {"key":"8","parentKey":"1","sortNum":3,"name":"i"}]
  121. siblings 100 []
  122. siblings 0 [
  123. {"key":"0","parentKey":null,"sortNum":0,"name":"a"}]
  124. siblings 3 [
  125. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  126. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  127. {"key":"4","parentKey":"1","sortNum":8,"name":"e"}]
  128. siblings 6 [
  129. {"key":"6","parentKey":"5","sortNum":6,"name":"g"}]
  130. prenext 6 [
  131. null,
  132. {"key":"6","parentKey":"5","sortNum":6,"name":"g"},
  133. null]
  134. prenext 4 [
  135. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  136. {"key":"4","parentKey":"1","sortNum":8,"name":"e"},
  137. null]
  138. prenext 0[
  139. null,
  140. {"key":"0","parentKey":null,"sortNum":0,"name":"a"},
  141. null]
  142. prenext 8 [
  143. {"key":"3","parentKey":"1","sortNum":3,"name":"d"},
  144. {"key":"8","parentKey":"1","sortNum":3,"name":"i"},
  145. {"key":"4","parentKey":"1","sortNum":8,"name":"e"}]
  146. find 6
  147. {"key":"6","parentKey":"5","sortNum":6,"name":"g"}

cljs: 参考ztree/core_test.cljs

  1. (defn test []
  2. (let [d [
  3. { :key "3" :parentKey "1" :sortNum 3 :name "d"}
  4. { :key "7" :parentKey "2" :sortNum 7 :name "h"}
  5. { :key "4" :parentKey "1" :sortNum 8 :name "e"}
  6. { :key "0" :parentKey nil :sortNum 0 :name "a"}
  7. { :key "6" :parentKey "5" :sortNum 6 :name "g"}
  8. { :key "2" :parentKey "0" :sortNum 2 :name "c"}
  9. { :key "1" :parentKey "0" :sortNum 1 :name "b"}
  10. { :key "5" :parentKey "2" :sortNum 5 :name "f"}
  11. { :key "8" :parentKey "1" :sortNum 3 :name "i"}
  12. ]
  13. tree (ztree/create-cljs-tree [:key :parentKey :sortNum :children] d)
  14. ]
  15. (.log js/console "raw-list" (.stringify js/JSON (clj->js (ztree/get-raw tree))))
  16. (.log js/console "treelike" (.stringify js/JSON (clj->js (ztree/get-treelike tree))))
  17. (.log js/console "full-tree" (.stringify js/JSON (clj->js (ztree/get-tree tree))))
  18. (.log js/console "descendant 1" (.stringify js/JSON (clj->js (ztree/pluck-descendant tree ["1"]))))
  19. (.log js/console "descendant 1 5" (.stringify js/JSON (clj->js (ztree/pluck-descendant tree ["1","5"]))))
  20. (.log js/console "ancestors 5" (.stringify js/JSON (clj->js (ztree/pluck-ancestors tree ["5"]))))
  21. (.log js/console "ancestors 5 7" (.stringify js/JSON (clj->js (ztree/pluck-ancestors tree ["5","7"]))))
  22. (.log js/console "survivors 2" (.stringify js/JSON (clj->js (ztree/pluck-survivors tree ["2"]))))
  23. (.log js/console "survivors 2 4" (.stringify js/JSON (clj->js (ztree/pluck-survivors tree ["2","4"]))))
  24. (.log js/console "siblings 100" (.stringify js/JSON (clj->js (ztree/pluck-siblings tree "100"))))
  25. (.log js/console "siblings 0" (.stringify js/JSON (clj->js (ztree/pluck-siblings tree "0"))))
  26. (.log js/console "siblings 3" (.stringify js/JSON (clj->js (ztree/pluck-siblings tree "3"))))
  27. (.log js/console "siblings 6" (.stringify js/JSON (clj->js (ztree/pluck-siblings tree "6"))))
  28. (.log js/console "prenext 6" (.stringify js/JSON (clj->js (ztree/pluck-prenext tree "6"))))
  29. (.log js/console "prenext 4" (.stringify js/JSON (clj->js (ztree/pluck-prenext tree "4"))))
  30. (.log js/console "prenext 0" (.stringify js/JSON (clj->js (ztree/pluck-prenext tree "0"))))
  31. (.log js/console "prenext 8" (.stringify js/JSON (clj->js (ztree/pluck-prenext tree "8"))))
  32. (.log js/console "find 6" (.stringify js/JSON (clj->js (ztree/find tree "6"))))
  33. ))
  34. 输出同js

打包成依赖库

ztree是一个用cljs写的list->tree库,也是一个打包cljs为npm依赖包的教程,源码中有足够丰富的注释

  1. ztree.cljs
  2. ;使用cljs来写代码可以获得不少好处:
  3. ; 不变性,gcc高级编译,lisp函数式写法,宏,clojure代码重用,记忆函数,尾递归优化等等等等
  4. ;cljs非常适合编写依赖库
  5. ;
  6. ;export的目的就是为了让js可以调用编译好的包,
  7. ;如果只是想让cljs调用(参考core_test.cljs),那就不需要export相关代码(可以删掉^:exoprtaset js/exports
  8. ;
  9. ;export的方式有2
  10. ; 一种是^:export
  11. ; 这种方式会把被标记为^:export的方法或对象暴露到全局,
  12. ; 当前项目不使用这种方式,所以上面的标记都被注释掉,标记方式类似如下
  13. ; (defprotocol (^:export some-fn []) (^:export some-fn-2 []) )
  14. ; (defn ^:export some-fn-3 [] ... )
  15. ; 用于直接在html的<script>标签中引入js
  16. ; 然后用namespace.exported_fn的方式调用,参考tree.html,类似如下
  17. ; ztree.create_js_tree(...);
  18. ; 另一种是aset js/exports
  19. ; 即把暴露的方法或对象绑定到exports
  20. ; 这种方式用于将代码打包为npm依赖包,上传到npm仓库上,
  21. ; 参考package.jsonnpm init,npm login,npm publish
  22. ; 需要引用该依赖包的代码可以配置package.json增加 "cl-js-ztree": "^x.x.x",
  23. ; 并使用npm install来下载该依赖,然后调用方式类似如下
  24. ; //在.js或.jsx文件中引入
  25. ; import ztree from 'cl-js-ztree';
  26. ; ztree.create_js_tree(...);

相关脚本:

  1. lein new ztree
  2. npm init //生成package.json,需修改一些配置才能发布成功
  3. npm login //需要在npm官网注册账号
  4. npm publish //发布
  5. npm unpublish <package>@<version>

License

Copyright © 2017 shann09

Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.