递归调用 - javascript递归数组递归问题

查看:139
本文介绍了递归调用 - javascript递归数组递归问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

现在有个需求,需要根据服务端请求的数据,组装成一个树节点,也就是parent-child节点,服务端请求后的数据结构如下图,topology是一个object,object下面的key是一个parent,value是child数组。

var topology = {1:['2'],2:['29','39','38','37'],24:['27'],29:['24'],37:['42'],38:['43'],39:['47'],42:['46'],43:['45']}

比如上图中的1有一个child是一个数组["2"],这个value为2的child又有4个child,也就是["29","39","38","37"]

最终需要生成如下数据结构,即key是parent的string,child因为有多个,所以是一个数组

const data = {"1":{"2":{"29":{"24":{"27":["26"]}},"39":["47"],"38":{"43":["45"]},"37":{"42":["46"]}}}}

再次先谢过了。

解决方案

var topology = [ ... ];

function rebuildTopo(index) {
    var topo = topology[index];
    var check = false;
    
    if(!topo) {
        return null;
    } else if(topo instanceof Array) {
        var obj = {};
        
        for(var j in topo) {
            var t = topo[j];
            obj[t] = rebuildTopo(t);
            
            if(!!obj[t])
                check = true;
        }
        
        if(check)
            return obj;
        else
            return Object.keys(obj);
    }
}

console.log(JSON.stringify({1: rebuildTopo(1)}));

结果:

Update

针对你所说的结构,又写了一段:

var topology = [ ... ];

function rebuildTopo(index) {
    var topo = topology[index];
    
    if(!topo) {
        return {key: index};
    } else if(topo instanceof Array) {
        var obj = {};
        
        obj.key = index;
        obj.children = topo.map(function(v, i) {
            return rebuildTopo(v);
        });
        
        return obj;
    }
}

console.log(JSON.stringify(rebuildTopo(1)));

不得不说,新的数据结构反而更容易理解,也更加容易写。当然,其实!topo判断和topo instanceof Array判断可以合并,写作

function rebuildTopo(index) {
    var topo = topology[index];

    var obj = {};
    
    obj.key = index;
    obj.children = (topo || []).map(function(v, i) {
        return rebuildTopo(v);
    });
    
    return obj;
}

后者略有区别,当子元素不存在时候也会有children: [],而前者由于分开判断了!topo,所以子元素不存在就不会有children项。

这篇关于递归调用 - javascript递归数组递归问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆