树形结构数据处理方法

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 }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值