最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript如何將數(shù)據(jù)處理成樹形結(jié)構(gòu)

 更新時(shí)間:2023年06月07日 10:16:21   作者:司寧  
這篇文章主要介紹了JavaScript如何將數(shù)據(jù)處理成樹形結(jié)構(gòu)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

JavaScript將數(shù)據(jù)處理成樹形結(jié)構(gòu)

第一個(gè)方法是使用遞歸

可以處理多層嵌套。

(react的value值和key值不一樣是會(huì)報(bào)錯(cuò)的,而且key值要唯一,如果這組數(shù)據(jù)需要帶有搜索功能的話是要設(shè)置treeNodeFilterProp來指定根據(jù)哪個(gè)字段來搜索的)。

如果傳進(jìn)來的數(shù)據(jù)保證是有字段的可以省略判斷的步驟,遞歸這個(gè)方法也可以結(jié)合第二個(gè)方法讓代碼看起來更簡潔。

function toTree(data) {
? ? for (let i = 0; i < data.length; i++) {
? ? ? data[i].value = data[i].id || '';
? ? ? data[i].title = data[i].name || '';
? ? ? data[i].key = data[i].id || '';
? ? ? data[i].children = data[i].list || [];
? ? ? if (data[i].children && data[i].children.length > 0) {
? ? ? ? toTree(data[i].children);
? ? ? }
? ? }
? ? return data;
}

第二個(gè)方法是直接遍歷

只能處理一層嵌套,但是要比遞歸簡單,由于react可以只設(shè)置value和key其中一個(gè),在這個(gè)方法中就不特別增加key了。

function toTree(data) {
? ? return data.map((item) => {
? ? ? return {
? ? ? ? title: item.name,
? ? ? ? value: item.id,
? ? ? ? children: item.list.map((item1) => {
? ? ? ? ? return {
? ? ? ? ? ? title: item1.name,
? ? ? ? ? ? value: item1.id,
? ? ? ? ? };
? ? ? ? }),
? ? ? };
? ? });
}

根據(jù)id將平級(jí)數(shù)據(jù)轉(zhuǎn)換成樹形結(jié)構(gòu)數(shù)據(jù)

從數(shù)據(jù)庫查詢的每一條數(shù)據(jù)都包含id 和pid 字段,將獲得的數(shù)據(jù)轉(zhuǎn)換成樹形結(jié)構(gòu)

id 與 pid 的關(guān)系 ===> pid 等于0 的是最外層數(shù)據(jù), pid 等于最外層 數(shù)據(jù)的id,將這條數(shù)據(jù)放在第二層,

不確定有多少層,理論上可以有無數(shù)層,循環(huán)數(shù)據(jù)變成樹形結(jié)構(gòu):

// 數(shù)據(jù)循環(huán)
    levelLoop(arr) {
      const returnArr = []; // 返回的數(shù)組
      let levelArr = []; // 當(dāng)前層級(jí)的數(shù)組
      let lastLevelArr = []; // 上一層數(shù)組
      let idLevleArr = []; // 當(dāng)前層級(jí)id的數(shù)組
      let lastIdLevleArr = []; // 上一層級(jí)id的數(shù)組
      let indexLevelArr = []; // 當(dāng)前層級(jí)索引的數(shù)組
      return curLoop(arr);
      function curLoop(curArr) {
        curArr.forEach((curItem, curIndex) => {
          if (curItem.pid === 0) {
            // 最外層
            returnArr.push(curItem);
            levelArr.push(curItem);
            idLevleArr.push(curItem.id);
            indexLevelArr.unshift(curIndex); // 添加到最前面,遍歷刪除元素時(shí)從后面開始刪除,不會(huì)影響index的位置
          } else {
            const lastIndex = lastIdLevleArr.indexOf(curItem.pid);
            if (lastIndex > -1) {
              // 屬于上一層級(jí)的子級(jí)
              // 如果上一層級(jí)沒有child則添加該屬性,此時(shí)添加是保證有子元素指向上一層級(jí)才添加child
              if (!lastLevelArr[lastIndex].children) {
                lastLevelArr[lastIndex].children = [];
              }
              levelArr.push(curItem);
              lastLevelArr[lastIndex].children.push(curItem);
              idLevleArr.push(curItem.id);
              indexLevelArr.unshift(curIndex);
            }
          }
        });
        lastLevelArr = levelArr;
        levelArr = [];
        lastIdLevleArr = idLevleArr;
        idLevleArr = [];
        indexLevelArr.forEach(index => {
          curArr.splice(index, 1); // 刪除當(dāng)前層級(jí)的元素,使總數(shù)量不斷減少
        });
        indexLevelArr = [];
        if (curArr.length) {
          return curLoop(curArr);
        } else {
          return returnArr;
        }
      }
    }
  },

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評(píng)論

西平县| 桃源县| 炉霍县| 收藏| 海淀区| 淳安县| 庆云县| 石家庄市| 抚松县| 安岳县| 江孜县| 黄平县| 天柱县| 根河市| 屏山县| 名山县| 诸暨市| 中超| 天峨县| 木里| 南安市| 蓝山县| 乌鲁木齐县| 永丰县| 芦山县| 淳安县| 辽阳县| 承德县| 杭锦旗| 定安县| 疏附县| 灵璧县| 杭锦旗| 巫山县| 东平县| 兴国县| 额尔古纳市| 公安县| 裕民县| 凌海市| 法库县|