js格式化列表数据的方法

/**
 * 格式化列表的方法
 */
export function treeToList(
  tree = [],
  idValue = null,
  childrenField = 'children',
  idField = 'menuId',
  parentIdField = 'parentId',
) {
  const list = []
  if (!childrenField) childrenField = 'children'
  for (let i = 0, j = tree.length; i < j; i++) {
    const d = tree[i]
    const id = d[idField]
    if (!list.some((l) => l[idField] === id)) {
      list.push(d)
    }
    if (parentIdField) d[parentIdField] = idValue
    const children = d[childrenField]
    if (children && children.length > 0) {
      const items = treeToList(
        children,
        id,
        childrenField,
        idField,
        parentIdField,
      )
      const values = items.values()
      for (const v of values) {
        if (!list.some((l) => l[idField] === v[idField])) {
          list.push(v)
        }
      }
    }
  }
  return list
}

export function listToTree(
  list = [],
  root = null,
  idField = 'menuId',
  parentIdField = 'parentId',
) {
  const tree = []
  const hash = {}
  const childrenField = 'children'
  for (let i = 0, l = list.length; i < l; i++) {
    const d = list[i]
    hash[d[idField]] = d
  }

  for (let i = 0, l = list.length; i < l; i++) {
    const d = list[i]
    const parentID = d[parentIdField]
    if (parentID === '' || parentID === 0) {
      tree.push(d)
      continue
    }

    const parent = hash[parentID]
    if (!parent) {
      tree.push(d)
      continue
    }

    let children = parent[childrenField]
    if (!children) {
      children = []
      parent[childrenField] = children
    }
    children.push(d)
  }

  if (root) {
    root[childrenField] = tree
    return [root]
  }

  return tree
}

export function getListParents(
  list = [],
  idValue,
  idField = 'menuId',
  parentIdField = 'parentId',
  includeSelf = false,
) {
  const parents = []
  const self = list.find((o) => o[idField] === idValue)
  if (!self) {
    return parents
  }

  if (includeSelf) {
    parents.unshift(self)
  }

  let parent = list.find((o) => o[idField] === self[parentIdField])
  while (parent && parent[idField] > 0) {
    parents.unshift(parent)
    parent = list.find((o) => o[idField] === parent[parentIdField])
  }
  return parents
}
export function getTreeParentsWithSelf(
  tree = [],
  idValue,
  childrenField = 'children',
  idField = 'menuId',
  parentIdField = 'parentId',
  parentIdValue = 0,
) {
  const list = treeToList(
    tree,
    parentIdValue,
    childrenField,
    idField,
    parentIdField,
  )
  return getListParents(list, idValue, idField, parentIdField, true)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值