将线性结构 转换成 树型结构

103 阅读1分钟
const cityData=
`天津市,天津市,宁河区
天津市,天津市,武清区
天津市,天津市,西青区
河北省,石家庄市,高邑县
河北省,石家庄市,藁城区,一个街道,一个小区
河北省,石家庄市,行唐县
`
// 如何将以上字符串转换成下面这种数据结构呢?
       // [{
           // name: '天津市', children: [
            //    {
           //         name: "天津市",
            //        children: [{
              //          name: "宁河区"
          //          }]
       //         }
       //     ]
     //       }]
           
        const cityStrArr = cityData.split('\n') //首先分割成数组

        const tree = []
        console.time(1)
        cityStrArr.forEach(n => {
            setChildren(n.split(',')) // 这里n.split(',')分割出来的数组的长度就是递归的深度,
        })
        console.timeEnd(1)

        function setChildren(arr) { // 通过reduce可以设置任意深度的城市数据
            arr.reduce((children, n) => { // reduce很像递归,这里完全可以转换成递归
                let ob
                if (children.length === 0) {
                    children.push({ name: n, children: [] })
                    ob = children[0].children
                } else {
                    children.some(m => {
                        if (m.name == n) {
                            ob = m.children
                            return true
                        }
                    })
                    if (!ob) {
                        let item = { name: n, children: [] }
                        children.push(item)
                        ob = item.children
                    }
                }
                return ob
            }, tree)
        }