import _ from 'loadsh'
const defaultChildrenName = 'children'
const defaultKeyName = 'id'
function DoNothingFn(v) {
return v
}
function EmptyFn() {}
/**
* @function
* @param { Array } treeData 数据
* @param { function } [keyName=id] 唯一id
* @param { object } [childrenName=children] 子节点字段名
*/
// 递归循环遍历树节点
function forEachTree(
treeData = [],
fn = EmptyFn,
childrenName = defaultChildrenName
) {
_.forEach(treeData, (item) => {
if (fn(item) === false) {
return false
}
forEachTree(item[childrenName], fn, childrenName)
})
}
// 递归循环遍历树节点
function mapTree(treeData = [], fn = DoNothingFn, childrenName = defaultChildrenName) {
return treeData.map(({ [childrenName]: children = [], ...others }) => fn({
...others,
[childrenName]: mapTree(children, fn, childrenName)
}))
}
// 扁平化tree返回对应的值
function flatTree(
treeData = [],
fn = DoNothingFn,
childrenName = defaultChildrenName
) {
const newArr = []
forEachTree(
treeData,
(node) => {
newArr.push(fn(node))
},
childrenName
)
return newArr
}
// 根据id查找当前项
function findParentNode(
treeData = [],
key = '',
keyName = defaultKeyName,
childrenName = defaultChildrenName
) {
let NODE = null
forEachTree(
treeData,
(v) => {
if (v[keyName] === key) {
NODE = v
return false
}
},
childrenName
)
return NODE
}
const treeMethods = {
forEachTree,
flatTree,
findParentNode,
mapTree
}
export { treeMethods }
树形结构数据处理方法
最新推荐文章于 2024-05-21 23:21:19 发布