欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue樹形結構數(shù)據(jù)處理的方法總結

 更新時間:2023年11月30日 11:44:54   作者:佛系菇?jīng)? 
在項目開發(fā)的過程中,會經(jīng)常使用樹形結構數(shù)據(jù),前后端交互都會對數(shù)據(jù)進行處理,后端返回的數(shù)據(jù)前端有的時候不能直接使用需要轉換,本文小編整理了一些項目中用到的處理方法,需要的朋友可以參考下
  • 將樹形節(jié)點改為一維數(shù)組
const generateList = (data: any, dataList: any[] = []) => {
  // console.log(data,dataList, 183);
  
  for (let i = 0; i < data?.length; i++) {
    const node = data[i];
    const { id } = node;
    dataList?.push(id);
    if (node.children) {
      generateList(node.children, dataList);
    }
  }
  return dataList
}

data 為要處理的樹形結構數(shù)組, dataList 為空數(shù)組,循環(huán)遍歷 data 數(shù)組,取到節(jié)點 id,push 到 dataList 中,得到新數(shù)組,如果有子集就繼續(xù)遍歷取節(jié)點,這樣遞歸下去就可以得到所有節(jié)點的一維數(shù)組。

  • 通過節(jié)點,查找該節(jié)點在樹形結構中的路徑
const getPathByKey = (curKey: any[], data: departTree[]) => {
  let single: departTree[] = []; // 記錄路徑結果
  let result: any = []
  let traverse = (id: number, path: any, data: departTree[]) => {
    if (data?.length === 0) {
      return;
    }
    for (let item of data) {
      path.push(item);
      if (item.id === Number(id)) {
        single = JSON.parse(JSON.stringify(path.map((el: any) => el.id)));
        return;
      }
      const children = Array.isArray(item.children) ? item.children : [];
      traverse(id, path, children); // 遍歷子集
      path.pop(); // 回溯
    }
  }
  for (let i = 0; i < curKey.length; i++) {
    traverse(curKey[i], [], data);
    result.push(single)
  }
  return result;
}

data 為樹形結構數(shù)組, curKey 為節(jié)點數(shù)組。traverse 方法獲取節(jié)點路徑。循環(huán)遍歷 curKey,調用 traverse 方法就可獲得節(jié)點的路徑。

  • 重構統(tǒng)計樹形數(shù)據(jù),修改鍵值。
const mapTree = (org: any) => {
  const haveChildren = Array.isArray(org.children) && org.children.length > 0;
  return {
    label: org.egname + ' (' + org.chname + ')',
    value: org.id,
    children: haveChildren ? org.children.map((i: any) => mapTree(i)) : undefined
  }
}

通過 map 函數(shù)遞歸出新的樹形數(shù)據(jù),定義自己想要的鍵值。

  • 重新構造樹形結構,將空子集且空員工的節(jié)點去掉
const generateTree = (data: any, dataList: any[] = []) => {
    // 將樹形數(shù)組轉變?yōu)橐痪S數(shù)組
    for (let i = 0; i < data?.length; i++) {
        const node = data[i];
        const { id, pid, name, twname, egname, employees, children } = node;
        dataList.push({ id, pid, name, egname, twname, employees, children });
        if (node.children) {
            generateTree(node.children, dataList);
        }
    }
    // 將一維數(shù)組中的空集過濾
    const array = dataList.filter((item: any) => item.employees?.length !== 0 && item.children?.length !== 0)
    // 將過濾后的一維數(shù)組重新生成樹形結構
    return listToTree(array)
}
/**
 * 列表轉為樹,pid 值未知
 * @param {*} list 
 * @returns 
 */
function listToTree(list: any[]) {
    let newArray: any[] = [];
    let finalTree: any[] = [];
    let ids: any[] = []; // id 數(shù)組
    let pids: any[] = []  // pid 數(shù)組
    // 獲取列表中所有的 id
    list.forEach((item: any) => {
        ids.push(item.id)
    })
    // 獲取列表中所有的 pid
    list.forEach((item: any) => {
        pids.push(item.pid)
    })
    // 獲取兩者差值, 篩選出 pid 不等于 id 的值,找到父節(jié)點 pid
    const res = pids.filter(v => !ids.some((item) => item === v))
    // 根據(jù)父節(jié)點 pid, 找到父節(jié)點數(shù)據(jù)
    newArray = list.filter((item: any) => res.some((el) => el === item.pid))
    // 構造樹函數(shù),data 為要構造的一維數(shù)組,parentId 為父節(jié)點 pid
    function buildTree(data: any[], parentId: number) {
        let tree: any[] = [];
        data.forEach(node => {
            if (node.pid === parentId) {
                let children = buildTree(data, node.id);
                if (children.length > 0) {
                    node.children = children;
                }
                tree.push(node);
            }
        });
        return tree;
    }
    // 根據(jù)父節(jié)點數(shù)據(jù)構造樹,考慮到父節(jié)點 pid 會有多個,循環(huán)遍歷數(shù)組。
    newArray.forEach((el: any) => {
        finalTree.push(...buildTree(list, el.pid))
    })
    // 因為父節(jié)點 pid 有可能有重復,這里做一個去重處理
    var obj = {};
    finalTree = finalTree.reduce((item: any, next: any) => {
            obj[next.id] ? '' : obj[next.id] = true && item.push(next);
            return item;
        }, [])
    
    return finalTree
}
  • 將掛在子集的數(shù)據(jù)疊加掛到父級上。遞歸疊加處理
function getUsersForDepartment(departments: Department[]) {
    // 遞歸查找部門的所有員工
    function getAllEmployees(node: Department): any[] {
        const employees = [];
        if (node?.employees) {
            employees.push(...node?.employees);
        }
        if (node?.children && node?.children?.length > 0) {
            node.children.forEach((child) => {
                if (getAllEmployees(child)) {
                    employees.push(...getAllEmployees(child));
                }
            });
        }
        return employees;
    }
    // 將子集的數(shù)據(jù)掛載到父級的 allUsers 
    function findSubUsers(depts: Department[]) {
        depts.forEach(el => {
            el.allUsers = getAllEmployees(el)
            if (el.children && el.children.length > 0) {
                findSubUsers(el.children)
            }
        })
    }
    // 遞歸增加 allUsers
    findSubUsers(departments)
}

以上就是vuejs樹形結構數(shù)據(jù)處理的方法總結的詳細內容,更多關于vuejs樹形結構數(shù)據(jù)處理的資料請關注腳本之家其它相關文章!

相關文章

  • Vue用Export2Excel導出excel,多級表頭數(shù)據(jù)方式

    Vue用Export2Excel導出excel,多級表頭數(shù)據(jù)方式

    這篇文章主要介紹了Vue用Export2Excel導出excel,多級表頭數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • crypto-js對稱加密解密的使用方式詳解(vue與java端)

    crypto-js對稱加密解密的使用方式詳解(vue與java端)

    這篇文章主要介紹了如何在Vue前端和Java后端使用crypto-js庫進行AES加密和解密,前端通過創(chuàng)建AES.js文件來實現(xiàn)加密解密功能,并在Vue文件或JavaScript中使用,后端則可以直接使用Java代碼進行AES加密和解密操作,需要的朋友可以參考下
    2025-01-01
  • 使用Vue實現(xiàn)一個樹組件的示例

    使用Vue實現(xiàn)一個樹組件的示例

    這篇文章主要介紹了使用Vue實現(xiàn)一個樹組件的示例,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-11-11
  • Vue SPA首屏加載緩慢問題解決方案

    Vue SPA首屏加載緩慢問題解決方案

    這篇文章主要介紹了Vue SPA首屏加載緩慢問題解決方案,首屏時間(First Contentful Paint),指的是瀏覽器從響應用戶輸入網(wǎng)址地址,到首屏內容渲染完成的時間,此時整個網(wǎng)頁不一定要全部渲染完成,但需要展示當前視窗需要的內容
    2023-03-03
  • vue使用pdfjs-dist+fabric實現(xiàn)pdf電子簽章的思路詳解

    vue使用pdfjs-dist+fabric實現(xiàn)pdf電子簽章的思路詳解

    最近領導提了一個新需求:仿照e簽寶,實現(xiàn)pdf電子簽章,本文給大家介紹vue使用pdfjs-dist+fabric實現(xiàn)pdf電子簽章的思路,感興趣的朋友一起看看吧
    2023-12-12
  • 詳解Vue中的自定義指令

    詳解Vue中的自定義指令

    這篇文章主要介紹了Vue中的自定義指令的相關資料,幫助大家更好的理解和學習vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue使用動態(tài)添加路由(router.addRoutes)加載權限側邊欄的方式

    vue使用動態(tài)添加路由(router.addRoutes)加載權限側邊欄的方式

    這篇文章主要介紹了vue使用動態(tài)添加路由(router.addRoutes)加載權限側邊欄的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Vue打包優(yōu)化之生產環(huán)境刪除console日志配置

    Vue打包優(yōu)化之生產環(huán)境刪除console日志配置

    這篇文章主要為大家介紹了Vue打包優(yōu)化之生產環(huán)境刪除console日志配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Element中Slider滑塊的具體使用

    Element中Slider滑塊的具體使用

    這篇文章主要介紹了Element中Slider滑塊的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • vue3.0中使用websocket,封裝到公共方法的實現(xiàn)

    vue3.0中使用websocket,封裝到公共方法的實現(xiàn)

    這篇文章主要介紹了vue3.0中使用websocket,封裝到公共方法的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評論