js数组树形结构(求子节点所有父祖先和while求和)

本文介绍了如何在给定的嵌套JSON对象中,使用递归函数找到特定节点(如`32`)的父节点数组,并计算所有节点值的总和。`findParentArr`函数用于查找父节点,`whileSum`函数实现深度优先遍历求和。
摘要由CSDN通过智能技术生成
const data={
    id:'0',
    value:0,
    children:[
        {
            id:'1',
            value:1,
            children:[
                {
                    id:'11',
                    value:11,
                    children:[
                        {
                            id:'111',
                            value:111,
                            children:[
                                {
                                    id:'1111',
                                    value:1111,
                                },
                                {
                                    id:'1112',
                                    value:1111,
                                },
                            ]
                        },
                        {
                            id:'112',
                            value:112,
                        },
                    ]
                },
                {
                    id:'12',
                    value:12,
                },
                {
                    id:'13',
                    value:13,
                    children:[
                        {
                            id:'131',
                            value:131,
                        },
                        {
                            id:'132',
                            value:132,
                        },
                    ]
                },
                {
                    id:'14',
                    value:14,
                },
            ]
        },
        {
            id:'2',
            value:2,
        },
        {
            id:'3',
            value:3,
            children:[
                {
                    id:'31',
                    value:31,
                },
                {
                    id:'32',
                    value:32,
                },
            ]
        },
        {
            id:'4',
            value:4,
        },
    ]
};
findParentArr(data,'32');
function findParentArr(data,target) {
    let parentArr=[];
    const topData=data;
    const findTarget=(childNode,target)=>{
        for (let i = 0; i < childNode.length; i++) {
            const currentNode = childNode[i];
            if(currentNode.id===target) return currentNode.id;
            else if(currentNode.children){
                const topId=findTarget(currentNode.children,target);
                if(topId){
                    parentArr.unshift(topId);
                    return currentNode.id;
                }
            }
            
        }
    }
    const topId=findTarget(topData.children,target);
    if(topId) parentArr.unshift(topId);
    parentArr.pop();
    parentArr=[topData.id,...parentArr];
    console.log(parentArr);
    return parentArr;
}
whileSum(data);
function whileSum(data){
    let sum=0;
    const topData=data;
    const stack=[...topData.children];
    let tmpNode=null;
    while(stack.length>0){
        tmpNode=stack.pop();
        if(!tmpNode) return;
        sum+=tmpNode.value;
        if(tmpNode.children &&tmpNode.children.length>0){
            for (i=tmpNode.children.length-1; i >=0 ; i--) {
                stack.push(tmpNode.children[i]);
            }
        } 
    }
    sum+=topData.value;
    console.log('whileSum:',sum); 
    return sum;
}

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值