[
['a', 'b'],
['a', 'c'],
['d', 'e', 'f'],
['d', 'e', 'g', 'h'],
['d', 'i']
]
转换成如下结构:
[
{
"name": "a",
"child": [
{
"name": "b"
},
{
"name": "c"
}
]
},
{
"name": "d",
"child": [
{
"name": "e",
"child": [
{
"name": "f"
},
{
"name": "g",
"child": [
{
"name": "h"
}
]
}
]
},
{
"name": "i"
}
]
}
]
解决方案
//首先定义一个递归函数(tree:结果,value:当前的值,parent:父节点的值)
function arrpush (tree, value, parent) {
tree.forEach((item, index) => {
if (item.name === parent) {
//判断是不是第一层节点
if (_.find(item.child, { name: value })) {
//存在当前节点跳过
return;
} else {
//将节点放到当前节点的子节点里
item.child.push({
name: value,
child: []
});
}
} else {
if (item.child.length > 0) {
//子节点不为空的时候寻找节点的所属位置,递归调用
return this.arrpush(item.child, value, parent);
}
}
});
};
//定义app方法来进行结果的运算
function app (array) {
let tree = [];
array.forEach((item, index) => {
//第一层循环
item.forEach((ite, ind) => {
//第二层循环
if (ind > 0) {
//不是第一个节点
this.arrpush(tree, ite, item[ind - 1]);
} else {
//第一个节点
if (_.find(tree, { name: ite })) {
return;
} else {
tree.push({
name: ite,
child: []
});
}
}
});
});
console.log(tree);
};
//运行app方法
app([
['a', 'b'],
['a', 'c'],
['d', 'e', 'f'],
['d', 'e', 'g', 'h'],
['d', 'i']
]);
总结
首先考虑如何形成树形结构,父子之间的联系是什么。这里我用name当唯一标示。 考虑清楚联系,然后就是递归运算,要判断当前的节点存在与否。如果不判断一味添加,就会造成节点的重复。所以要有适当的过滤。