扁平化數據解構轉化成樹形結構 VueTreeselect


https://www.cnblogs.com/slongs/p/10881729.html

扁平化數據解構轉化成樹形結構

 

有時候從后台傳給前端的是扁平化的數據,但是前端為了生成樹狀結構數據,需要進行一下轉換,下面就是一個將扁平化解構轉換成樹狀結構

     /** * @description 將扁平化數據 轉換成 樹狀結構 * @param {Array} arrayList 扁平化的數據 * @param {String} pidStr parentId的key名 * @param {String} idStr id的key名 * @param {String} childrenStr children的key名 */ function fommat({arrayList, pidStr = 'pid', idStr = 'id', childrenStr = 'children'}) { let listOjb = {}; // 用來儲存{key: obj}格式的對象 let treeList = []; // 用來儲存最終樹形結構數據的數組 // 將數據變換成{key: obj}格式,方便下面處理數據 for (let i = 0; i < arrayList.length; i++) { listOjb[arrayList[i][idStr]] = arrayList[i] } // 根據pid來將數據進行格式化 for (let j = 0; j < arrayList.length; j++) { // 判斷父級是否存在 let haveParent = listOjb[arrayList[j][pidStr]] if (haveParent) { // 如果有沒有父級children字段,就創建一個children字段 !haveParent[childrenStr] && (haveParent[childrenStr] = []) // 在父級里插入子項 haveParent[childrenStr].push(arrayList[j]) } else { // 如果沒有父級直接插入到最外層 treeList.push(arrayList[j]) } } return treeList } // 測試數據 var menu_list = [{ id: '1', menu_name: '設置', menu_url: 'setting', parent_id: 0 }, { id: '1-1', menu_name: '權限設置', menu_url: 'setting.permission', parent_id: '1' }, { id: '1-1-1', menu_name: '用戶管理列表', menu_url: 'setting.permission.user_list', parent_id: '1-1' }, { id: '1-1-2', menu_name: '用戶管理新增', menu_url: 'setting.permission.user_add', parent_id: '1-1' }, { id: '1-1-3', menu_name: '角色管理列表', menu_url: 'setting.permission.role_list', parent_id: '1-1' }, { id: '1-2', menu_name: '菜單設置', menu_url: 'setting.menu', parent_id: '1' }, { id: '1-2-1', menu_name: '菜單列表', menu_url: 'setting.menu.menu_list', parent_id: '1-2' }, { id: '1-2-2', menu_name: '菜單添加', menu_url: 'setting.menu.menu_add', parent_id: '1-2' }, { id: '2', menu_name: '訂單', menu_url: 'order', parent_id: 0 }, { id: '2-1', menu_name: '報單審核', menu_url: 'order.orderreview', parent_id: '2' }, { id: '2-2', menu_name: '退款管理', menu_url: 'order.refundmanagement', parent_id: '2' }, { id: '2-2-1', menu_name: '退款管理2-1', menu_url: 'order.refundmanagement', parent_id: '2-2' } ] // 輸出 console.log( fommat({ arrayList: menu_list, pidStr: 'parent_id' }) ) 
 
 
 
填充VueTreeselect
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <!-- include Vue 2.x -->
    <script src="https://cdn.jsdelivr.net/npm/vue@^2"></script>
    <!-- include vue-treeselect & its styles. you can change the version tag to better suit your needs. -->
    <script src="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.umd.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@riophae/vue-treeselect@^0.4.0/dist/vue-treeselect.min.css">
 
</head>
<body>
    <div id="app">
      <treeselect v-model="value" :multiple="false" :options="options" />
    </div>
</body>
<script>
/**
        * @description 將扁平化數據 轉換成 樹狀結構
        * @param {Array} arrayList 扁平化的數據
        * @param {String} pidStr parentId的key名
        * @param {String} idStr id的key名
        * @param {String} childrenStr children的key名
        */
       function fommat({arrayList, pidStr = 'pid', idStr = 'id', childrenStr = 'children'}) {
           let listOjb = {}; // 用來儲存{key: obj}格式的對象
           let treeList = []; // 用來儲存最終樹形結構數據的數組
           // 將數據變換成{key: obj}格式,方便下面處理數據
           for (let i = 0; i < arrayList.length; i++) {
               listOjb[arrayList[i][idStr]] = arrayList[i]
           }
           // 根據pid來將數據進行格式化
           for (let j = 0; j < arrayList.length; j++) {
               // 判斷父級是否存在
               let haveParent = listOjb[arrayList[j][pidStr]] 
               if (haveParent) {
                   // 如果有沒有父級children字段,就創建一個children字段
                   !haveParent[childrenStr] && (haveParent[childrenStr] = [])
                   // 在父級里插入子項
                   haveParent[childrenStr].push(arrayList[j])
               } else {
                   // 如果沒有父級直接插入到最外層
                   treeList.push(arrayList[j])
               }
           }
           return treeList
       }
            

        // 測試數據
        var menu_list = [{
          id: '1',
          label : '設置',
          menu_url: 'setting',
          parent_id: 0
        }, {
          id: '1-1',
          label : '權限設置',
          menu_url: 'setting.permission',
          parent_id: '1'
        }, {
          id: '1-1-1',
          label : '用戶管理列表',
          menu_url: 'setting.permission.user_list',
          parent_id: '1-1'
        }, {
          id: '1-1-2',
          label : '用戶管理新增',
          menu_url: 'setting.permission.user_add',
          parent_id: '1-1'
        }, {
          id: '1-1-3',
          label : '角色管理列表',
          menu_url: 'setting.permission.role_list',
          parent_id: '1-1'
        }, {
          id: '1-2',
          label : '菜單設置',
          menu_url: 'setting.menu',
          parent_id: '1'
        }, {
          id: '1-2-1',
          label : '菜單列表',
          menu_url: 'setting.menu.menu_list',
          parent_id: '1-2'
        }, {
          id: '1-2-2',
          label : '菜單添加',
          menu_url: 'setting.menu.menu_add',
          parent_id: '1-2'
        }, {
          id: '2',
          label : '訂單',
          menu_url: 'order',
          parent_id: 0
        }, {
          id: '2-1',
          label : '報單審核',
          menu_url: 'order.orderreview',
          parent_id: '2'
        }, {
          id: '2-2',
          label : '退款管理',
          menu_url: 'order.refundmanagement',
          parent_id: '2'
        }, {
          id: '2-2-1',
          label : '退款管理2-1',
          menu_url: 'order.refundmanagement',
          parent_id: '2-2'
        }
    ]

var treedata = fommat({
               arrayList: menu_list,
               pidStr: 'parent_id'
           });
           
    // 輸出
    console.log(treedata       )           
       
        // register the component
    Vue.component('treeselect', VueTreeselect.Treeselect)

    new Vue({
      el: '#app',
      data: {
        // define the default value
        value: null,
        // define options
       // options: [ {
       //   id: 'a',
       //   label: 'a',
       //   children: [ {
       //     id: 'aa',
       //     label: 'aa',
       //   }, {
       //     id: 'ab',
       //     label: 'ab',
       //   } ],
       // }, {
       //   id: 'b',
       //   label: 'b',
       // }, {
       //   id: 'c',
       //   label: 'c',
       // } ],
       options:treedata
      },
    })
</script>
</html>

 

 

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM