2021-02-20 js 把平級列表數(shù)據(jù)list 快速轉(zhuǎn)換為嵌套關(guān)系的list數(shù)據(jù)

我在為公司的舊項目添加功能的時候遇到了這么一個問題畦木,由于舊項目使用的是比較舊的 jquery框架,而我新加的功能模塊使用的是vue + elementui何暇,在使用element 的級聯(lián)組件的時候發(fā)現(xiàn)舊有的接口返回的地址數(shù)據(jù)都是平鋪的容客,這就跟element 的組建的默認(rèn)的數(shù)據(jù)嵌套結(jié)構(gòu)不一致了,因此前端這邊就需要做一下數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換黔姜。

一開始我的想法是使用遞歸的方式一遍一遍的遍歷數(shù)組然后重組成嵌套的對象,后來我發(fā)現(xiàn)這樣的遍歷3000多條數(shù)據(jù)效率太低了蒂萎,很容易就卡死的頁面。而經(jīng)過了后端大佬的額指點后換了另一種方法淮椰,效率馬上就翻了好幾倍五慈。

數(shù)據(jù)格式

[{
    "name": "北京市",
    "pId": "0",
    "id": "110000"
}, {
    "name": "北京城區(qū)",
    "pId": "110000",
    "id": "110100"
}, {
    "name": "東城區(qū)",
    "pId": "110100",
    "id": "110101"
}]

js邏輯

var app = new Vue({
          el: '#app',
          data: {
            message: 'Hello Vue!',
            options:[]
          },
          created() {
            let obj = {}, newarr = []
            axios.get('./dy.json').then(res=>{
                let data = res.data
                console.log(data)
                // 后端的數(shù)據(jù)默認(rèn)規(guī)定第一層的數(shù)據(jù)pid為0
                for (let i = 0; i < data.length; i++) {
                    if(data[i].pId == "0") {    // 一地步就是先把第一層的數(shù)據(jù)單獨拿出來
                        newarr.push(data[i])
                    }
                    obj[data[i].id] = data[i]    // 以id 為屬性名,吧數(shù)組轉(zhuǎn)換為對象主穗,方便下面再次遍歷的時候吧數(shù)據(jù)掛到上層的children 中
                }
                
                for (let i = 0; i < data.length; i++) {
                    let pid = data[i].pId;
                    if(pid in obj) {   // 排除第一層的數(shù)據(jù)泻拦,通過當(dāng)前數(shù)據(jù)的pid 找到obj 中的自己的上級
                        if(!obj[pid].hasOwnProperty('children')) {   //為自己的上級添加一個children 數(shù)組用于存放與自身同組的成員數(shù)據(jù)
                            obj[pid].children = []
                        }
                        obj[pid].children.push(data[i])  // 入列
                    }
                }
                obj = null // 清空對象內(nèi)存
                this.options = JSON.parse(JSON.stringify(newarr).replaceAll('name', 'label').replaceAll('id','value'))
            })
          }
        })

完整代碼

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link  rel="stylesheet">
        <style type="text/css">
        
        </style>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.0/index.js"></script>
    </head>
    <body>
        <div id="app">
          {{ message }}
          <el-cascader :options="options" :show-all-levels="false"></el-cascader>
        </div>
    </body>
    <script type="text/javascript">
        var app = new Vue({
          el: '#app',
          data: {
            message: 'Hello Vue!',
            options:[]
          },
          created() {
            let obj = {}, newarr = []
            axios.get('./dy.json').then(res=>{
                let data = res.data
                for (let i = 0; i < data.length; i++) {
                    if(data[i].pId == "0") {
                        newarr.push(data[i])
                    }
                    obj[data[i].id] = data[i]
                }
                
                for (let i = 0; i < data.length; i++) {
                    let pid = data[i].pId;
                    if(pid in obj) {
                        if(!obj[pid].hasOwnProperty('children')) {
                            obj[pid].children = []
                        }
                        obj[pid].children.push(data[i])
                    }
                }
                obj = null
                this.options = JSON.parse(JSON.stringify(newarr).replaceAll('name', 'label').replaceAll('id','value'))
            })
          }
        })
        
    </script>
</html>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忽媒,隨后出現(xiàn)的幾起案子争拐,更是在濱河造成了極大的恐慌,老刑警劉巖晦雨,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件架曹,死亡現(xiàn)場離奇詭異,居然都是意外死亡闹瞧,警方通過查閱死者的電腦和手機(jī)绑雄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奥邮,“玉大人万牺,你說我怎么就攤上這事罗珍。” “怎么了脚粟?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵覆旱,是天一觀的道長。 經(jīng)常有香客問我核无,道長扣唱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任厕宗,我火速辦了婚禮画舌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘已慢。我一直安慰自己曲聂,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布佑惠。 她就那樣靜靜地躺著朋腋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膜楷。 梳的紋絲不亂的頭發(fā)上旭咽,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機(jī)與錄音赌厅,去河邊找鬼穷绵。 笑死,一個胖子當(dāng)著我的面吹牛特愿,可吹牛的內(nèi)容都是我干的仲墨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼揍障,長吁一口氣:“原來是場噩夢啊……” “哼目养!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起毒嫡,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤癌蚁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兜畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體努释,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年咬摇,在試婚紗的時候發(fā)現(xiàn)自己被綠了洽洁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡菲嘴,死狀恐怖饿自,靈堂內(nèi)的尸體忽然破棺而出汰翠,到底是詐尸還是另有隱情,我是刑警寧澤昭雌,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布复唤,位于F島的核電站,受9級特大地震影響烛卧,放射性物質(zhì)發(fā)生泄漏佛纫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一总放、第九天 我趴在偏房一處隱蔽的房頂上張望呈宇。 院中可真熱鬧,春花似錦局雄、人聲如沸甥啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜈漓。三九已至,卻和暖如春宫盔,著一層夾襖步出監(jiān)牢的瞬間融虽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工灼芭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留有额,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓彼绷,卻偏偏與公主長得像谆吴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苛预,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容