blog-使用JavaScript实现一棵树

题目:有一个数组对象,每个对象有一个属性id,name,children(存放孩子对象id的数组)。使用JavaScript根据这个数组对象实现一棵树。
HTML

<body>
    <div id="tree">
    </div>
</body>

JavaScript

// 根据数组对象打印一棵人事关系树,children数组的元素是每个对象的id
// 假定id=1为根节点
let arr = [
    {id:1,name:'校长',children:[2,3,4]},
    {id:3,name:'副校长',children:[]},
    {id:7,name:'班主任',children:[]},
    {id:6,name:'年级主任',children:[7,8]},
    {id:5,name:'年级主任',children:[]},
    {id:8,name:'班主任',children:[]},
    {id:2,name:'副校长',children:[5,6]},
    {id:4,name:'副校长',children:[]},
]

// 将数组遍历一次,将每个对象的id和name存入一个map集合中 id为key,name为value
// 以方便子元素的查找
let map = new Map();
arr.forEach((item) => {map.set(item.id,item.name)});

// 1.先过滤出有孩子节点的对象
let HasChildNode = arr.filter(item => item.children.length!=0);
// 2.将对象按id的顺序从小到大排序
HasChildNode.sort((a,b) => {if(a.id>b.id) return 1;});

// 3.遍历有孩子节点的数组对象
HasChildNode.forEach((item)=>{
    // 若该对象的id为1,则该对象为根元素
    if(item.id == 1){
        // 获取div节点
        let FatherNode = document.getElementById('tree');
        // 创建一个ul节点和li节点
        let a = document.createElement('ul');
        let b = document.createElement('li');
        // 给li节点添加id属性
        b.setAttribute('id',item.id)
        // 创建文本节点,将每棵树上节点的文字追加至li
        let c = document.createTextNode(item.id+"."+item.name);
        b.appendChild(c);
        a.appendChild(b);
        // 将根元素节点追加到div中
        FatherNode.appendChild(a);
    }
    
    // 获取当前对象id的li节点(用于追加孩子节点)
    let FatherNode = document.getElementById(item.id);
    
    // 创建一个ul节点,用于存放子元素
    let d = document.createElement('ul');
    // 遍历这个对象存放孩子节点id的数组
    item.children.forEach((item)=>{
        // 使用前面存放了id和name的map集合判断这个孩子对象是否存在
        if(map.has(item)){
            // 这个孩子对象存在则创建li节点存放文本节点
            let n = document.createElement('li');
            n.setAttribute('id',item)
            // 使用map集合的get方法根据key获取对象的name
            let x = document.createTextNode(item+"."+map.get(item));
            n.appendChild(x);
            // 将这个孩子对象追加至循环外创建的ul节点内
            d.appendChild(n)
        }
    })
    // 给有孩子节点的元素追加孩子元素
    FatherNode.appendChild(d);
})

运行结果:
在这里插入图片描述

由于作者经验不足,在代码实现功能方面能力有限,若后续有更优的实现方案作者会继续对本文进行更新
此文章为作者本人原创,仅限于作者本人的学习总结记录,若有错误之处请留言提出。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于 el-select 组件嵌套一棵树的需求,可以使用 el-cascader 组件来实现。el-cascader 是 Element UI 提供的级联选择器组件,可以很方便地实现树形结构的选择。 要嵌套一棵树,你需要传入一个数组作为 el-cascader 的 options 属性,每个数组项代表一个级别的选项,并且包含 label 和 value 属性。如果某个选项还有子选项,可以在该项内再嵌套一个 options 数组。 下面是一个示例代码: ```html <el-cascader v-model="selectedOptions" :options="options" :props="props" placeholder="请选择" ></el-cascader> ``` ```javascript data() { return { selectedOptions: [], // 用于接收选中的值 options: [ { value: '1', label: '选项1', children: [ { value: '1-1', label: '选项1-1', children: [ { value: '1-1-1', label: '选项1-1-1' }, { value: '1-1-2', label: '选项1-1-2' } ] }, { value: '1-2', label: '选项1-2' } ] }, { value: '2', label: '选项2' } ], props: { value: 'value', label: 'label', children: 'children' } } } ``` 在上述示例中,options 数组定义了树形结构的选项,每个选项都有 value 和 label 属性,通过 children 属性可以嵌套子选项。props 对象定义了各个属性的名称,通过它来指定 value、label 和 children 的字段名。 这样,el-cascader 组件就能够实现嵌套一棵树的效果了。当用户选择某个选项时,selectedOptions 数组会更新为选中的值。你可以根据 selectedOptions 数组来获取用户选择的值或者进行进一步的处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值