接个吻. 2023-01-29 22:11 采纳率: 93.1%
浏览 118
已结题

树型结构的数据怎么匹配分支

img

问题描述:

仔细看上图数据结构会发现value和parent是有关联的,这种关联非常类似于树型数据,那问题来了,这种数据是可以有n层数据的,要怎么查找并对树型数据进行处理就成了1大问题,我想实现只需要通过某个value值就可以获取到往上的每一个分支数据并可以进行处理,比如对show属性赋值什么的,往上查找有n个分支的可能(n个的意思是往上不知道有多少层),然后往下只需要找1个分支(只需要通
过value匹配一下parent就可以)。for循环应该没办法处理树型数据,树型数据应该要使用递归算法来处理,希望能给一个正解。

结构描述:

value -- 类似于ID
parent -- 类似于父级ID

思路:

1.要想通过某个value来找到上级,应该是先匹配当前value的对象,然后通过下标或对象拿到当前对象的parent,最后再用parent去匹配value就可以匹配到父级了。(问题在这里,这个思路只能匹配到一个分支,但是我想匹配到往上的n个分支)
2.要想通过某个value来找到子级,应该是直接用value匹配parent,这样就可以找到所有子级了。(这个思路只能匹配到一个分支)

  • 写回答

6条回答 默认 最新

  • CSDN专家-showbo 2023-01-30 11:58
    关注
    获得3.30元问题酬金

    找父节点一般只有一条路径吧,为什么会出现多个呢?一个节点一般只有一个父节点,难道还要找父节点兄弟节点的子节点?

    找指定节点所有子节点简单,将这个节点的value和遍历到的子节点的value全部压入数组,是否子节点遍历到的节点的parent是否在数组即可。

    
        let list = [
            {name:'全部分类', value: null, parent: null },
            { name: '视频', value: '682395', parent: null },
            { name: '音频', value: '971824', parent: null },
            { name: '流量', value: '891628', parent: null },
            { name: '编辑', value: '276312', parent: null },
            { name: '原创', value: '785312', parent: '682395' },
            { name: '改编', value: '981726', parent: '682395' },
            { name: '美食', value: '217241', parent: '785312' },
            { name: '科技', value: '783102', parent: '785312' },
            { name: '动画', value: '412842', parent: '981726' },
        ]
        function getParentNodes(value,list) {//只有一条,没搞清楚找父节点会有多个分支
            var node = list.find(i => i.value == value);
            if (node) {//找到节点
                var pNodes = [];//如果需要放入查找的节点这里改为var pNodes = [node];
                while (node = list.find(i => i.value == node.parent)) {
                    pNodes.unshift(node);//将父节点前插
                    if (node.value === null) break;//找到顶级节点退出
                }
    
                return pNodes;
            }
    
            return null;//找不到需要查找的value返回null,注意判断getParentNodes函数返回值
        }
    
    
        function visitChildren(value, list) {
            var index = list.findIndex(i => i.value == value);
            if (index != -1) {//找到节点
                var pids = [list[index].value];//父节点集合
                for (var i = index + 1; i < list.length; i++) {
                    if (pids.includes(list[i].parent)) {
                        console.log(list[i]);//子节点
                        pids.push(list[i].value);//加入父id
                    }
                }
            }
        }
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 2月6日
  • 赞助了问题酬金15元 1月29日
  • 创建了问题 1月29日

悬赏问题

  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程