let a="北京/A/海淀 \n" +
"北京/A/朝阳\n" +
"北京/B/西城\n" +
"北京/B/东城\n" +
"上海/AA/徐汇\n" +
"上海/AA/黄浦\n" +
"上海/CC/EE/TT/EEEE/EEEEEE/AAAAAAAAAAAAAAAAAAA/长宁\n" +
"上海/DD/静安"
function parseTree(multiStr){
let rawItems=[]
let arr=[]
let arrTree=[]
Array.from(new Set(multiStr.split("\n"))).forEach(function (item, index) {
let items=item.split("/")
function cc(level,items){
if(level>1){
return {label:items[items.length-level],value:items[items.length-level],children:[cc(level-1,items)]}
}else{
return {label:items[items.length-1],value:items[items.length-1]}
}
}
rawItems.push(cc(items.length,items))
})
rawItems.forEach(item=>{
if(arr.indexOf(item.label)===-1){
arr.push(item.label)
arrTree.push({label:item.label,value:item.value,children:[]})
}
arrTree[arr.indexOf(item.label)].children=arrTree[arr.indexOf(item.label)].children.concat(item.children)
})
return arrTree.map(item=>{
function cc2(tree){
if(!tree.children||tree.children.length===0){
return tree
}else{
let tmp=[]
let tmpTree=[]
tree.children.forEach(item2=>{
if(tmp.indexOf(item2.label)===-1){
tmp.push(item2.label)
if(item2.children){
tmpTree.push({label:item2.label,value:item2.value,children:[]})
}else{
tmpTree.push({label:item2.label,value:item2.value})
}
}
if(item2.children&&item2.children.length>0){
tmpTree[tmp.indexOf(item2.label)].children=tmpTree[tmp.indexOf(item2.label)].children.concat(item2.children)
}
})
tree.children=tmpTree.map(e=>cc2(e))
return tree
}
}
return JSON.parse(JSON.stringify(cc2(item)))
})
}
console.log(parseTree(a))
输出为树形结构的JS数组集合。