过滤没有达到指定层级的空节点

230 阅读1分钟

用来记录总是忘; 感兴趣的小伙伴可以写在评论里进行持续优化呦~~~

/**
 * @function filterEmptyNode
 * @description 当子节点为空时,去掉父节点
 * @param items 当前数据
 * @param args { childrenKey: 'children', levelMax: null as any, num: 1 }
 *              childrenKey:是子节点的key;levelMax:最大层级;num:循环的当前层级,一级:1 ,二级:2 ,...
 */
export function filterEmptyNode(
  items: Array<IFormData>,
  args = { childrenKey: 'children', levelMax: null as any, num: 1 }
) {
  // 判空 如果没数据直接返回
  if (!items || items.length === 0) {
    return items
  }
  // 计算最高level的默认值
  if (!args.levelMax || args.levelMax === null) {
    // 获取最大level
    args.levelMax = maxLength(items) // 一级:1 ,二级:2 ,...
    // 如果最大值就是1级  直接返回数组
    if (args.levelMax === 1) {
      return items
    }
  }
  // 当前层级的默认值
  if (!args.num) {
    args.num = 1 // 一级:1 ,二级:2 ,...
  }

  for (let i = 0; i < items.length; i += 1) {
    if (!!items[i][args.childrenKey] && items[i][args.childrenKey].length > 0) {
      // 筛选下一级
      const node = filterEmptyNode(items[i][args.childrenKey], {
        ...args,
        num: args.num + 1
      })
      // 返回的node节点时空的话 说明子节点已经被删除完  不满足条件删除掉
      if (node.length === 0) {
        // 不是组后一级的话 并且没有子节点  就删除掉该数据
        items.splice(i, 1)
        // 删除完数据  i往前进一位
        i -= 1
      }
    } else if (args.num < args.levelMax) {
      // 不是组后一级的话 并且没有子节点  就删除掉该数据
      items.splice(i, 1)
      // 删除完数据  i往前进一位
      i -= 1
    }
  }

  return items
}