@zhengxs/js.tree
快速,轻量,无依赖的树结构数据处理函数库。
特点
- 一个循环解决行转树的问题
- 转树除了添加
children
属性,不会修改任何数据 - 支持任意关系字段,如:id,parentId, children 字段
- 支持动态导出树节点
- 内置
filter/map
树遍历快捷方法 lodash
是可选的,详见底部介绍
文档
安装
$ npm i @zhengxs/js.tree --save
使用
行转树
import { toTree, ROOT_ID } from '@zhengxs/js.tree'
const data = [
{ id: 2, parentId: null },
{ id: 3, parentId: 1 },
{ id: 1, parentId: null }
]
const result = toTree(data, {
root: ROOT_ID,
idKey: 'id',
parentKey: 'parentId',
childrenKey: 'children',
transform(data) {
return Object.create(data)
}
})
树转行
import { toRows } from '@zhengxs/js.tree'
const data = [
{ id: 2, parentId: null, children: [] },
{
id: 1,
parentId: null,
children: [{ id: 3, parentId: 1, children: [] }]
}
]
const result = toRows(data, 'children')
内容过滤
import { filter } from '@zhengxs/js.tree'
const data = [
{
title: '财务',
children: [{ title: '收入流失' }, { title: '财务设置' }]
},
{
title: '站点设置',
children: [{ title: '菜单维护' }, { title: '角色维护' }]
}
]
const result = filter(data, (node, index, parents) => {
return node.title.indexOf('设置') > -1
})
const result = filter(data, callback, 'items')
修改内容
import { map } from '@zhengxs/js.tree'
const data = [
{
title: '财务',
children: [{ title: '收入流失' }, { title: '财务设置' }]
},
{
title: '站点设置',
children: [{ title: '菜单维护' }, { title: '角色维护' }]
}
]
const result = map(data, (node, index, parents) => {
if (node.title === '财务') {
node.children = []
return node
}
node.title = node.title + '测试'
return node
})
const result = map(data, callback, 'items')
TypeScript
内置 ts 类型
import { toTree } from '@zhengxs/js.tree'
type MenuItem = {
id: string
parentId: string
text: string
url?: string
}
interface Nav extends MenuItem {
items: Nav[]
}
toTree<Nav>(source, {
childrenKey: 'items'
})
对不同构建版本的解释
umd 模块使用 es5
,其他版本使用的是 es2015
。
在包的 dist/ 目录你将会找到很多不同的构建版本,这里列出了它们之间的差别:
| UMD | CommonJS | ES Module |
---|
无依赖 | js.tree.js | js.tree.common.js | js.tree.esm.js |
无依赖(生产环境) | js.tree.min.js | | |
包含 lodash 模块 | | js.tree.common.lodash.js | js.tree.esm.lodash.js |
包含 lodash-es 模块 | | | js.tree.esm.lodash-es.js |
除环境导致的,为了减少包体积,和项目共享 lodash
模块。
但不是所有项目都会引入,为了避免这种情况,默认的都是不带的。
License