js通用工具utils——tree,与树处理相关的函数

排序相关逻辑

1.生成排序函数 generateSortFn

/**
 * 生成排序函数
 * @param {string}  sortField  排序字段
 * @param {boolean} asc       是否正序
 * @returns {Function}  排序函数
 */
function generateSortFn(sortField, asc) {
  return (a, b) => {
    const valueA = a[sortField]
    const valueB = b[sortField]
    if (valueA > valueB) {
      if (asc) {
        return 1
      }
      return -1
    }
    if (asc) {
      return -1
    }
    return 1
  }
}

2. 数组根据函数进行排序 sortData(data, sortFun)

// 数组根据函数进行排序
function sortData(data, sortFun) {
  data.sort(sortFun)
}

3.对树进行排序(通过自定义函数) sortTreeByFunction

/**
 * 对树进行排序(通过自定义函数)
 * @param {Array}  treeData  树
 * @param {Function}  sortFun  排序函数
 */
export const sortTreeByFunction = function (treeData, sortFun) {
  sortData(treeData, sortFun)
  treeData.forEach((item) => {
    const children = item.children
    if (children && children.length > 0) {
      sortData(children, sortFun)
      sortTreeByFunction(children, sortFun)
    }
  })
  return treeData
}

4.对树进行排序(通过字段)

/**
 * 对树进行排序(通过字段)
 * @param {Array}  treeData  树
 * @param {string}  sortField  排序字段
 * @param {boolean} asc       是否正序
 * @returns {Array} 排序树
 */
export const sortTreeByField = function (treeData, sortField, asc = true) {
  return sortTreeByFunction(treeData, generateSortFn(sortField, asc))
}

树形结构数据和数组结构数据相互转化

1.数组结构转化成树结构


/**
 * 数组结构转化成树结构
 * @returns {Array}
 */
export const arrayToTree = function (
  data = [],
  invalId = [],
  id = 'id',
  parentId = 'parentId',
) {
  // 结果
  const result = []
  // 复制数据
  const dataTemp = cloneDeep(data)

  dataTemp.forEach((item) => {
    // 添加children
    if (!item.children) {
      item.children = []
    }

    // 去掉无效节点
    if (invalId.includes(item[id]))
      return

    // parentUuid值
    const parentIdValue = item[parentId]

    // 不存在parent值
    if (!parentIdValue) {
      item._level = 1
      result.push(item)
    }
    else {
      // 父对象
      const parent = find(dataTemp, node => node[id] === parentIdValue)
      // 不存在父对象
      if (!parent) {
        item._level = 1
        result.push(item)
        return
      }
      if (!parent.children) {
        parent._level = parent._level ? parent._level : 1
        parent.children = []
      }
      // 添加到父对象children
      item._level = parent._level + 1
      parent.children.push(item)
    }
  })
  return result
}

2.树转化数组

/**
 * 树转化数组
 * @param {Array}  treeData  树
 * @param {string}  childsKey  树
 * @returns {Array} 数组
 */
export const treeToArray = function (treeData = [], childsKey = 'children') {
  let result = []
  Array.from(treeData).forEach((record) => {
    result.push(record)
    if (record[childsKey] && record[childsKey].length > 0) {
      const children = treeToArray(record[childsKey], childsKey)
      result = result.concat(children)
    }
  })
  return result
}

3.树的最后一级转化为数组

/**
 * 树的最后一级转化为数组
 * @param {Array}  treeData  树
 * @returns {Array} 数组
 */
export const treeFinalToArray = function (treeData) {
  let result = []
  Array.from(treeData).forEach((record) => {
    if (record.childNodes && record.childNodes.length > 0) {
      const children = treeFinalToArray(record.childNodes)
      result = result.concat(children)
    }
    else {
      result.push(record.data)
    }
  })
  return result
}

4.树对象转化数组

4/**
 * 树对象转化数组
 * @param {object}  treeObject  树
 * @param {string}  childKey  树
 * @returns {Array} 数组
 */
export const treeObjToArray = function (
  treeObject = {},
  childKey = 'children',
) {
  let result = []
  result.push(treeObject)
  if (treeObject[childKey]) {
    const children = treeObjToArray(treeObject[childKey], childKey)
    result = result.concat(children)
  }
  return result
}

查询问题分类路径数据

/**
 * 查询问题分类路径数据
 * @param {*} id
 * @param {*} data
 */
export function arrayTreePathData(id, data) {
  const item = {
    problemCategoryLevelId: [],
    problemCategoryLevelIds: [],
  }
  data.forEach((itema) => {
    itema.children.forEach((itemb) => {
      itemb.children.forEach((itemc) => {
        itemc.children.forEach((itemd) => {
          if (itemd.id === id) {
            item.problemCategoryLevelIds = [itema.id, itemb.id, itemc.id]
            item.problemCategoryLevelId = [itema.name, itemb.name, itemc.name]
          }
        })
      })
    })
  })
  return item
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值