国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

js遞歸操作樹形結構

這篇具有很好參考價值的文章主要介紹了js遞歸操作樹形結構。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

樹形結構轉(zhuǎn)成扁平結構

數(shù)據(jù)結構

  let data = [
    {
      name: "1",
      children: [{
        name: "3"
      }, {
        name: "4"
      }]
    },
    {
      name: "2",
      children: [{
        name: "5"
      }, {
        name: "6",
        children: [{name: "7"}]
      }]
    }
  ]

轉(zhuǎn)成扁平化

        function dataTree(data) {
            let result = [];
            for (const item of data) {
                // result.push(item)
                result.push({ name: item.name }) // 只取當前節(jié)點的信息,不包括 children
                if (item.children === null || item.children === undefined) {
                    continue;
                }
                let getChildren = dataTree(item.children)
                result = result.concat(getChildren)
            }
            return result
        }
        console.log("原數(shù)組結構", data);
        console.log("扁平化的對象", dataTree(data));

運行結果

js樹形結構遞歸,javascript,前端

扁平結構轉(zhuǎn)成樹形結構

數(shù)據(jù)結構

  let datas = [
    {id: 1, name: 1, parentId: null},
    {id: 2, name: 2, parentId: 1},
    {id: 3, name: 3, parentId: 1},
    {id: 4, name: 4, parentId: null},
    {id: 5, name: 5, parentId: 4},
    {id: 6, name: 6, parentId: 4},
    {id: 7, name: 7, parentId: 6},
    {id: 8, name: 8, parentId: 6},
  ]

轉(zhuǎn)成樹形結構

  function dataList(data){
    let map = {};
    for(let item of data){
      map[item.id] = item
    }
    let result = []; //存放數(shù)組
    for(let item of data){
      item.children = []; //給每個數(shù)組添加一個空children
      if(item.parentId === null){
        result.push(item)//最上級的標簽
      }else{
        //相當于用這個 parentId 當做父Id去查找對比查找數(shù)據(jù)
        let parent = map[item.parentId]
        //添加到剛剛定義children數(shù)組中去
        parent.children.push(item)
      }
    }
    return result;
  }
  console.log("扁平化轉(zhuǎn)換成樹形結構:");
  console.log("原數(shù)組結構",datas);
  console.log("樹形結構",dataList(datas));

運行結果

js樹形結構遞歸,javascript,前端

?根據(jù) parentId 查詢對應的上級所有父節(jié)點

數(shù)據(jù)結構

    const data = [
        {
            id: 1,
            parentId: undefined,
            name: 'TEST 1',
            children: [
                {
                    id: 5,
                    parentId:1,
                    name: 'TEST 5',
                    children: [
                        {
                            id: 10,
                            parentId:4,
                            name: 'TEST 10'
                        },
                        {
                            id: 11,
                            parentId:4,
                            name: 'TEST 11'
                        }
                    ]
                }
            ]
        },
        {
            id: 2,
            parentId: undefined,
            name: 'TEST 2',
            children: [
                {
                    id: 6,
                    parentId:2,
                    name: 'TEST 6'
                },
                {
                    id: 7,
                    parentId:2,
                    name: 'TEST 7'
                }
            ]
        },
        {
            id: 3,
            parentId: undefined,
            name: 'TEST 3',
            children: [
                {
                    id: 8,
                    parentId:3,
                    name: 'TEST 8'
                },
                {
                    id: 9,
                    parentId:3,
                    name: 'TEST 9'
                }
            ]
        },
        {
            id: 4,
            name: 'TEST 4',
            children: [
            ]
        }
    ]

根據(jù)parentId查找父節(jié)點

    /**
     *
     * @param list 最外層傳入的數(shù)組 也可以是 this.數(shù)組
     * @param parentId  子節(jié)點對應的上級關系parentId
     * @returns {*[]}
     */
    function findP(list,parentId){
        const result = []
        /**
         * 處理邏輯
         * @param arr   要對比的數(shù)組
         * @param parentId  傳遞進來數(shù)據(jù)要對比父id(相當于parentId)
         */
        let forFn = function (arr,parentId){
            for (let i = 0; i < arr.length; i++) {
                let item = arr[i];
                if (item.id === parentId){
                    result.push(item)
                    // console.log("遞歸數(shù)據(jù)",item)
                    // console.log("遞歸id",item.parentId)
                    forFn(list,item.parentId)
                    break
                }else {
                    if (item.children){
                        forFn(item.children,parentId)
                    }
                }
            }
        }
        forFn(list,parentId);
        return result;
    }
    console.log("數(shù)據(jù)結構==",data)
    console.log("查詢父類==",findP(data,11))

運行結果(會把自己及父節(jié)點保存下來)

js樹形結構遞歸,javascript,前端

?項目中運用到的(僅供參考)

需求:根據(jù)點擊子節(jié)點查詢沒有就一直向上查

思路:拿到樹形結構數(shù)組直接遞歸查詢

難點:

? ? ? ? 1)獲取懶加載的樹形結構,(因為懶加載封裝的數(shù)據(jù)結構是分開裝的)

? ? ? ? 2)拼接成樹形結構在處理

下面為實現(xiàn)例子 只列出大概實現(xiàn)思路文章來源地址http://www.zghlxwxcb.cn/news/detail-767456.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>悲傷敵敵畏</title>
</head>
<body>
<script type="text/javascript">
/**
 分析:
 1.獲取樹節(jié)點的數(shù)據(jù),
 2.因為是list結構的,先存放在map里面(遞歸)
 3.拼接成層級數(shù)據(jù) 返回(遞歸)
 4.根據(jù)parentId 查詢父級(遞歸)
 */
const data = [
    {
        childNodes: [
            {childNodes: [{childNodes:[],data:{id: 5, name: "測試5", parentId: 3}}], data: {id: 3, name: "測試3", parentId: 1}},
            {childNodes: [], data: {id: 4, name: "測試4", parentId: 1}}
        ],
        data: {id: 1, name: "測試1", parentId: null}
    },
    {
        childNodes: [],
        data: {id: 2, name: "測試2", parentId: null}
    },
];
console.info("要處理的數(shù)據(jù)結構 >>>",data)

    //使用函數(shù)
    forChildren(data)

    function forChildren(list){
        //TODO 轉(zhuǎn)成map結構,用于比較
        let map = {};
        let forMap = function (arr){
            for (const item of arr) {
                map[item.data.id] = item.data
                if (item.childNodes.length > 0){
                    forMap(item.childNodes)
                }
            }
        }
        forMap(list)
        console.log("封裝的map >>>",map)


        //TODO 拼接成層級數(shù)據(jù):
        let result = [];
        let forList =function(arr){
            for (const item of arr) {
                item.data.children = [] //為每個data添加一個數(shù)組
                if (item.data.parentId === null){ //判斷是否為最外層(最外層一般都是空或者-1)
                    result.push(item.data)
                }
                if (item.childNodes.length > 0){
                    for (const children of item.childNodes) {
                        let paren = map[children.data.parentId]
                        paren.children.push(children.data)
                        forList(item.childNodes)
                    }
                }
            }
        }
        forList(list)
        console.log("拼接好的樹形結構",result)


        //TODO 根據(jù)子節(jié)點查找上面的每個父節(jié)點
        let parents = []
        let forParent = function (arr,parentId){
            for (const item of arr) {
                if (item.id === parentId){
                    parents.push(item)
                    forParent(result,item.parentId)
                    break
                }else {
                    if (item.children){
                        forParent(item.children,parentId)
                    }
                }
            }
        }
        forParent(result,5)
        console.log("父級以及自己的數(shù)據(jù)",parents)
        
    }
</script>
</body>
</html>

到了這里,關于js遞歸操作樹形結構的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 超大量數(shù)據(jù),前端樹形結構展示

    后端返回了50萬數(shù)據(jù),讓前端一次性展示成樹,之前用的ant-design-vue的tree插件,卡的死死的,經(jīng)過大量實驗,現(xiàn)發(fā)現(xiàn)三種樹可以支持如此大數(shù)量的數(shù)據(jù)。 目錄 第一種:vue-easy-tree 使用方式: 1.安裝插件 2.引入插件 全局引入 組件引入 3.使用 ?在使用虛擬滾動時,必須設置?no

    2024年01月21日
    瀏覽(27)
  • js樹形結構數(shù)組扁平化

    js樹形結構數(shù)組扁平化 1. 樹形結構 ---- 扁平化數(shù)據(jù) 1.代碼如下(數(shù)據(jù)扁平化1示例): 2.代碼如下(數(shù)據(jù)扁平化2示例): 3.代碼如下(數(shù)據(jù)扁平化3示例): 4.代碼如下(數(shù)據(jù)扁平化4示例):

    2024年02月11日
    瀏覽(17)
  • JavaScript深拷貝(js深拷貝,JavaScript遞歸函數(shù),實現(xiàn)深拷貝)

    JavaScript深拷貝(js深拷貝,JavaScript遞歸函數(shù),實現(xiàn)深拷貝)

    簡述:JavaScript的深拷貝和淺拷貝大家都比較熟悉,今天來分享下深拷貝,就是使用該函數(shù)時,會復制拷貝一份該數(shù)據(jù),修改該數(shù)據(jù)屬性,不會改變原有數(shù)據(jù),就是把復制的對象所引用的對象全都復制了一遍,具體實現(xiàn)如下; 1、定義拷貝對象; 2、定義遞歸函數(shù)deepClone(),實現(xiàn)

    2024年02月15日
    瀏覽(21)
  • mysql數(shù)據(jù)庫遞歸查詢樹形結構(適用場景:菜單多級分類,多級關聯(lián)評論查詢),用strea流把list轉(zhuǎn)成樹的方法詳解

    mysql數(shù)據(jù)庫遞歸查詢樹形結構(適用場景:菜單多級分類,多級關聯(lián)評論查詢),用strea流把list轉(zhuǎn)成樹的方法詳解

    層次關系: 現(xiàn)在的需求是把這個層級關系,在前端顯示出來,后端的處理方法有兩種: 1.直接把全部的數(shù)據(jù)從數(shù)據(jù)庫中拿到,然后在java代碼里面使用樹形結構來進行解析,但是這種做法只能在數(shù)據(jù)量比較小的時候使用,然后數(shù)據(jù)量一大會造成內(nèi)存溢出 2.在mysql中創(chuàng)建一個函數(shù)

    2024年02月05日
    瀏覽(24)
  • java返回前端樹形結構數(shù)據(jù)(2種實現(xiàn)方式)

    0.思想 首先找到一級目錄(類別),然后從一級目錄(類別)遞歸獲取所有子目錄(類別),并組合成為一個“目錄樹” 1.普通實現(xiàn):controller層傳的是0層,就是一級目錄層,從這里開始往下遞歸。 2.stream流實現(xiàn): 3.實體類集合專VO類集合的工具類 入?yún)槲粗愋偷膶嶓w集合

    2024年02月04日
    瀏覽(28)
  • 78.(前端)分配權限頁面顯示——樹形結構使用(Element-ui的Tree樹形控件)

    78.(前端)分配權限頁面顯示——樹形結構使用(Element-ui的Tree樹形控件)

    在前端的操作中,應該增加修改、刪除、分配權限的操作 這次主要是實現(xiàn)分配權限的顯示?。。。。?! 更換icon圖標,并設計大小 綁定函數(shù),點擊彈出提示框(DIalog對話框) 在對話框內(nèi),應該顯示一個樹形結構提供選擇(Tree樹形控件) 初始化樹形結構,并填充數(shù)據(jù)

    2024年02月05日
    瀏覽(87)
  • 遞歸遍歷樹結構數(shù)據(jù)(js,vue)

    數(shù)據(jù)實例: 主要代碼:

    2024年02月13日
    瀏覽(21)
  • 前端Vue uni-app App/小程序/H5 通用tree樹形結構圖

    前端Vue uni-app App/小程序/H5 通用tree樹形結構圖

    隨著技術的發(fā)展,開發(fā)的復雜度也越來越高,傳統(tǒng)開發(fā)方式將一個系統(tǒng)做成了整塊應用,經(jīng)常出現(xiàn)的情況就是一個小小的改動或者一個小功能的增加可能會引起整體邏輯的修改,造成牽一發(fā)而動全身。 通過組件化開發(fā),可以有效實現(xiàn)單獨開發(fā),單獨維護,而且他們之間可以隨

    2024年02月16日
    瀏覽(29)
  • 【前端JS交互篇】函數(shù)、參數(shù)、返回值、閉包函數(shù)、遞歸函數(shù)、內(nèi)存、模塊化編程

    函數(shù)可以封裝一些功能,可以供外部去重復的調(diào)用。所以,一般我們把函數(shù)叫做具有重復功能的代碼塊。 JavaScript 基礎到高級 Canvas游戲開發(fā) 原生JavaScipt案例合集 JavaScript +DOM基礎 假設飯店就是一個函數(shù),飯店的功能就是做各種各樣的菜,但是具體做什么菜,需要用戶來點,用

    2024年02月15日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包