美文网首页
JS 常用的遍历树结构(目录型)操作

JS 常用的遍历树结构(目录型)操作

作者: 浪心y | 来源:发表于2020-01-18 16:05 被阅读0次

常见的基本结构如下,每个对象包含id, children

tips: 做了一定程度的不返回child操作,没做null 处理, null 值我个人倾向于在全局处理。一般会处理成undefined,其实就是直接删掉。

常见的树结构如下

const tree = [
    {
      id: 1,
      children: [
        {
          id: 8,
          children: []
        },
        {
          id: 2,
          children: [
            {
              id: 3,
              children: [
                {
                  id: 11,
                  children: [
                    {
                      id: 12
                    }
                  ]
                },
                {
                  id: 13
                },
                {
                  
                }
              ]
            }
          ]
        },
        {
          id: 10,
          children: [
            {
              id: 9,
            }
          ]
        },
        {
          id: 4,
          children: []
        }
      ]
    },
    {
      id: 5,
      children: []
    },
    {
      id: 6,
      children: [
        {
          id: 7,
          children: []
        }
      ]
    }
  ]


处理函数

/**
 * 根据树结构查找对象
 * @param {Array} tree 要遍历的树
 * @param {id} id 查找的节点id
 * @returns 查找到的路径 path为空数组,表示没找到
 */
const findItem = (tree, id) => {
  // 是否找到,flag 要定义在外面,循环里面每次循环会重新赋值,是不对的
  let flag = false
  // 查找的路径,当前塞的id,也可以往里面塞对象
  let path = []
  // 定义一个查找函数。递归使用
  /**
   * 内部真正查找的函数,递归使用
   * @param {Array} tree 要遍历的树
   * @param {id} id 查找的节点id
   * @param {Number} level 上级树级别,默认传的0(看不到的最外层不循环),每循环一层执行加1,
   */
  const find = (tree, id, level = 0) => {
    level += 1 // level 进行加1操作
    // 循环操作
    for (let index = 0; index < tree.length; index++) {
      // 如果找到了,不再循环,flag 外层定义,会终止所有的循环
      if (flag) break
      // 当前枝干
      const branch = tree[index]
      // 操作前,根据当前的level 清空一下,不需要的level,只保留当前level的父级以上的level
      path = path.slice(0, level - 1)
      // 将当前id加到路径里面,也可以添加对象
      path.push(branch.id)
      // eslint-disable-next-line
      if (branch.id == id) { // 隐式转换,利用一下
        flag = true
        break // 找到了,就返回
      }
      // 没找到,如果有children的话,就继续遍历children
      const { children = [] } = branch
      if (children.length) {
        find(children, id, level)
      }
    }
  }
  find(tree, id)
  if (!flag) path = []
  return path
}

复制代码自行尝试。

相关文章

  • JS 常用的遍历树结构(目录型)操作

    常见的基本结构如下,每个对象包含id, children tips: 做了一定程度的不返回child操作,没做nu...

  • js基础了解

    js数组常用遍历方法使用: js数组常用操作方法使用: 基本逻辑运算: 基本字符串操作方法:

  • 玩玩Linux-常用命令

    常用命令 文档目录操作 下载解压 功能型

  • php方法大合集

    文件系统处理 数组常用函数 字符串常用函数 文件的属性 解析目录路径 遍历目录小例子 文件的基本操作 读取文件内容...

  • JS树结构操作

    一、遍历树结构 1. 树结构介绍 JS中树结构一般是类似于这样的结构: 为了更通用,可以用存储了树根节点的列表表示...

  • JS树结构数据的遍历

    title: JS树结构数据的遍历date: 2022-04-14description: 针对项目中出现树形结构...

  • JS第七天-03

    DOM DOM树结构关系代码示例: 一、JS中标签关系 二、JS操作页面标签 三、JS操作DOM一般步骤 1、创建...

  • JavaScript网页特效(一)

    介绍常用js的字符串操作api ❤❤❤ 介绍常用js的保留小数操作api ❤❤ 介绍常用js的大小写转换操作a...

  • JS中数组与对象的各种遍历

    开门见山,我尽量精简,话说简书不能列目录,难道这不是刚需?? 一、JS原生方法1.JS遍历的常用方法有for循环和...

  • 字典

    本节大纲 字典的定义与特性 字典的常用操作 字典的遍历 字典的定义与特性 字典的常用操作 字典的遍历-案例 扩展-...

网友评论

      本文标题:JS 常用的遍历树结构(目录型)操作

      本文链接:https://www.haomeiwen.com/subject/ozwkzctx.html