91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

js將列表組裝成樹結構的兩種實現方式分別是什么

發布時間:2022-01-10 08:28:08 來源:億速云 閱讀:206 作者:柒染 欄目:開發技術

js將列表組裝成樹結構的兩種實現方式分別是什么,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

前言

工作中偶爾就會遇到后端同學丟來一個列表,要我們自己組裝成一個樹結構渲染到頁面上,本文以兩種不同方式探索生成樹的算法思想。

js將列表組裝成樹結構的兩種實現方式分別是什么

背景介紹

可組裝成樹結構的數組一般有以下幾個要素:

  • 當前節點id

  • parentId 當前節點的父節點id

  • children 子節點列表(可能不會在接口中返回,需要組裝時候自己加上)

原始結構:

js將列表組裝成樹結構的兩種實現方式分別是什么

目標結構:

js將列表組裝成樹結構的兩種實現方式分別是什么

關鍵就是一維數組中通過parentId找到其對應的父節點并添加到父節點的children數組中。

實現方案

最直接的方式就是遍歷數組,并把找到的子節點逐一添加到父節點中

function listToTreeSimple(data) {
  const res = [];
  data.forEach((item) => {
    const parent = data.find((node) => node.id === item.parentId);
    if (parent) {
      parent.children = parent.children || [];
      parent.children.push(item);
    } else {
      // * 根節點
      res.push(item);
    }
  });
  return res;
}

考慮進一步優化,使用哈希表,以id為key存儲每個節點值,省去data.find計算

function listToTree(data) {
  // * 先生成parent建立父子關系
  const obj = {};
  data.forEach((item) => {
    obj[item.id] = item;
  });
  // * obj -> {1001: {id: 1001, parentId: 0, name: 'AA'}, 1002: {...}}
  // console.log(obj, "obj")
  const parentList = [];
  data.forEach((item) => {
    const parent = obj[item.parentId];
    if (parent) {
      // * 當前項有父節點
      parent.children = parent.children || [];
      parent.children.push(item);
    } else {
      // * 當前項沒有父節點 -> 頂層
      parentList.push(item);
    }
  });
  return parentList;
}

即便數據量很小,帶來的性能提升也是顯著的

js將列表組裝成樹結構的兩種實現方式分別是什么

遞歸法

更有騷操作遞歸法,性能會很差,但代碼會很酷????

function recursiveToTree(data) {
  function loop(key) {
    const arr = [];
    data.forEach((item) => {
      if (item.parentId === key) {
        item.children = loop(item.id);
        arr.push(item);
      }
    });
    return res;
  }
  return loop(1);
}

看看性能,誒?看起來竟然遞歸性能最佳????

js將列表組裝成樹結構的兩種實現方式分別是什么

但是數據量稍微大一點

js將列表組裝成樹結構的兩種實現方式分別是什么

(上面遞歸,下面非遞歸)

資源

原始數據列表

const list = [
  {
    id: 1001,
    parentId: 0,
    name: "AA",
  },
  {
    id: 1002,
    parentId: 1001,
    name: "BB",
  },
  {
    id: 1003,
    parentId: 1001,
    name: "CC",
  },
  {
    id: 1004,
    parentId: 1003,
    name: "DD",
  },
  {
    id: 1005,
    parentId: 1003,
    name: "EE",
  },
  {
    id: 1006,
    parentId: 1002,
    name: "FF",
  },
  {
    id: 1007,
    parentId: 1002,
    name: "GG",
  },
  {
    id: 1008,
    parentId: 1004,
    name: "HH",
  },
  {
    id: 1009,
    parentId: 1005,
    name: "II",
  },
];

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

蓝山县| 丹寨县| 岢岚县| 武功县| 宜都市| 宁远县| 昌邑市| 石渠县| 温州市| 通海县| 汉源县| 长沙县| 调兵山市| 特克斯县| 郸城县| 土默特右旗| 枞阳县| 墨江| 南昌县| 北辰区| 英山县| 辽宁省| 连州市| 靖边县| 公主岭市| 监利县| 南雄市| 信宜市| 于田县| 扎鲁特旗| 宣城市| 永新县| 临邑县| 泗洪县| 玉环县| 茶陵县| 中牟县| 新巴尔虎右旗| 杭州市| 甘南县| 禄丰县|