递归调用 - javascript递归数组递归问题
本文介绍了递归调用 - 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屋!
查看全文