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

溫馨提示×

溫馨提示×

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

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

JavaScript實現樹結構轉換的方法有哪些

發布時間:2023-03-15 11:37:35 來源:億速云 閱讀:221 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“JavaScript實現樹結構轉換的方法有哪些”,內容詳細,步驟清晰,細節處理妥當,希望這篇“JavaScript實現樹結構轉換的方法有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

在 JavaScript 編程中,將數組轉換為樹結構是一個常見的需求。本篇博客將介紹五種常用的方法來實現數組轉樹結構,并討論每種方法的時間復雜度、空間復雜度和最優解。

假設有一個由對象組成的數組,每個對象包含 idparentId 兩個屬性。其中 id 表示節點的唯一標識,parentId 表示該節點的父節點的 id

const nodes = [
  { id: 1, parentId: null },
  { id: 2, parentId: 1 },
  { id: 3, parentId: 1 },
  { id: 4, parentId: 2 },
  { id: 5, parentId: 3 },
  { id: 6, parentId: 3 },
  { id: 7, parentId: 4 },
  { id: 8, parentId: 4 },
];

以上面的數組為例,我們將介紹以下五種方法來將其轉換為樹結構。

方法一:使用遞歸

function arrayToTreeRec(nodes, parentId = null) {
  return nodes
    .filter((node) => node.parentId === parentId)
    .map((node) => ({ ...node, children: arrayToTreeRec(nodes, node.id) }));
}

const tree = arrayToTreeRec(nodes, null);

時間復雜度:O(n^2),其中 n 是節點的數量。 空間復雜度:O(n^2)。 優缺點:不適合大規模數據。

方法二:使用循環

function arrayToTreeLoop(nodes) {
  const map = {};
  const tree = [];

  for (const node of nodes) {
    map[node.id] = { ...node, children: [] };
  }

  for (const node of Object.values(map)) {
    if (node.parentId === null) {
      tree.push(node);
    } else {
      map[node.parentId].children.push(node);
    }
  }

  return tree;
}

const tree = arrayToTreeLoop(nodes);

時間復雜度:O(n),其中 n 是節點的數量。 空間復雜度:O(n)。 優缺點:適合大規模數據。

方法三:使用 reduce

function arrayToTreeReduce(nodes) {
  const map = {};
  const tree = nodes.reduce((acc, node) => {
    map[node.id] = { ...node, children: [] };

    if (node.parentId === null) {
      acc.push(map[node.id]);
    } else {
      map[node.parentId].children.push(map[node.id]);
    }

    return acc;
  }, []);

  return tree;
}

const tree = arrayToTreeReduce(nodes);

時間復雜度:O(n),其中 n 是節點的數量。 空間復雜度:O(n)。 優缺點:代碼簡潔,適合中小規模數據。

方法四:使用哈希表

function arrayToTreeMap(nodes) {
  const map = new Map(nodes.map((node) => [node.id, { ...node, children: [] }]));
  const tree = [];

  for (const node of map.values()) {
    if (node.parentId === null) {
      tree.push(node);
    } else {
      map.get(node.parentId).children.push(node);
    }
  }

  return tree;
}

const tree = arrayToTreeMap(nodes);

時間復雜度:O(n),其中 n 是節點的數量。 空間復雜度:O(n)。 優缺點:適合大規模數據,而且由于使用了 Map,相比于方法二和方法三,能夠更方便地進行節點的查找和刪除。

方法五:使用深度優先搜索

function arrayToTreeDFS(nodes) {
  const map = new Map(nodes.map((node) => [node.id, { ...node, children: [] }]));
  const tree = [];
  for (const node of map.values()) {
    if (node.parentId === null) {
      dfs(node, tree);
    }
  }
  function dfs(node, parent) {
    if (parent) {
      parent.children.push(node);
    }
    for (const child of node.children) {
      dfs(map.get(child.id), node);
    }
  }
  return tree;
}
const tree = arrayToTreeDFS(nodes);

時間復雜度:O(n),其中 n 是節點的數量。 空間復雜度:O(n)。 優缺點:相比于方法二、方法三和方法四,可以更方便地進行深度優先搜索。

讀到這里,這篇“JavaScript實現樹結構轉換的方法有哪些”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

尉犁县| 张家口市| 海原县| 新蔡县| 墨脱县| 锦州市| 常山县| 卓尼县| 祁东县| 浮山县| 昌都县| 西峡县| 吉木萨尔县| 博罗县| 玉龙| 黑水县| 左云县| 定南县| 华蓥市| 延长县| 清苑县| 通州市| 锡林郭勒盟| 丹江口市| 溆浦县| 宁明县| 东阿县| 定安县| 灵宝市| 临猗县| 宽甸| 罗田县| 砀山县| 克拉玛依市| 油尖旺区| 哈巴河县| 民权县| 蓬安县| 东乌珠穆沁旗| 会东县| 山西省|