通过叶子节点的id找到整条链路上的id

297 阅读1分钟

list结构的子节点找到整个链路的code

/**
 * @function findCategoryCode
 * @description 找到当前节点的code,然后找当前节点的父节点,直到找到parentId = 0的节点
 * @description 还可以优化吧childrenNodes等参数的配置成动态的key,用的地方多 可以提到公共的方法中
 * @param data list格式的树
 * @param categoryId 当前节点的id
 */
const findCategoryCode = (data: any, categoryId: string): any => {
  const codes = [] as any

  for (let i = 0; i < data.length; i += 1) {
    // 找到当前节点
    if (data[i].id === categoryId) {
      // 把当前节点放起来
      codes.unshift(data[i].code)
      // 如果这个节点的父id是0 就直接返回数据
      if (data[i].parentId === 0) {
        return codes
      }
      // 如果父id不是0,继续查找
      const items = findCategoryCode(data, data[i].parentId)
      // 正常情况肯定会返回数据,这里做一个判空
      if (items.length > 0) {
        // 合并起来放起来
        codes.unshift(...items)
        return codes
      }
    }
  }
  return codes
}

// 处理类目回显格式
const dealShowCategory = (clas: any) => {
  // 判空
  if (!clas || clas.length === 0) {
    return []
  }
  const data = []
  for (let i = 0; i < clas.length; i += 1) {
    const item = findCategoryCode(state.categoryList, clas[i].categoryId)
    if (item.length > 0) {
      data.push(item)
    }
  }
  return data
}

tree结构的子节点找到整个链路的code

/**
 * @function filterEmptyNode
 * @description 先找到叶子节点,然后往回推到根节点,得到想要的数据
 * @description 还可以优化吧childrenNodes等参数的配置成动态的key,用的地方多 可以提到公共的方法中
 * @param data tree格式的树
 * @param categoryCode 叶子节点的code
 */
const findCategoryCode = (data: any, categoryCode: string): any => {
  const codes = [] as any
  for (let i = 0; i < data.length; i += 1) {
    // 先去子节点中查找
    if (data[i].childrenNodes && data[i].childrenNodes.length > 0) {
      const items = findCategoryCode(data[i].childrenNodes, categoryCode)
      // 有数据说明找到子节点了code,逐层返回
      if (items.length > 0) {
        items.unshift(data[i].code)
        return items
      }
    }
    // 判断子节点
    if (categoryCode === data[i].code) {
      codes.push(data[i].code)
      return codes
    }
  }
  return codes
}

// 处理类目回显格式
const dealShowCategory = () => {
  // 判空
  if (!state.baseForm.items || state.baseForm.items.length === 0) {
    return []
  }
  const data = []
  for (let i = 0; i < state.baseForm.items.length; i += 1) {
    const item = findCategoryCode(state.options, state.baseForm.items[i].categoryCode)
    if (item.length > 0) {
      data.push(item)
    }
  }
  return data
}
dealShowCategory()