成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你還在循環(huán)嵌套評論列表?教你一招把評論數(shù)據(jù)變成 Tree 結(jié)構(gòu)!

開發(fā)
將扁平結(jié)構(gòu)轉(zhuǎn)為樹形結(jié)構(gòu),在評論系統(tǒng)、后臺管理系統(tǒng)中非常常見,這段代碼簡潔高效,可直接應(yīng)用于實(shí)際項(xiàng)目。

在開發(fā)評論系統(tǒng)時,我們經(jīng)常會拿到“扁平化”的評論數(shù)據(jù),比如:

[
  {"id": 1, "parent_id": null, "content": "頂級評論"},
  {"id": 2, "parent_id": 1, "content": "這是對1的回復(fù)"},
  {"id": 3, "parent_id": 1, "content": "我也是對1的回復(fù)"},
  {"id": 4, "parent_id": 2, "content": "回復(fù)2"},
  {"id": 5, "parent_id": null, "content": "另一個頂級評論"}
]

這種結(jié)構(gòu)通常來自數(shù)據(jù)庫查詢,邏輯上是“父子關(guān)系”,但前端展示評論樓層時更希望拿到:

[
  {
    "id": 1,
    "content": "...",
    "children": [
      {
        "id": 2,
        "content": "...",
        "children": [
          {
            "id": 4,
            "content": "...",
            "children": []
          }
        ]
      },
      {
        "id": 3,
        "content": "...",
        "children": []
      }
    ]
  },
  {
    "id": 5,
    "content": "...",
    "children": []
  }
]

也就是所謂的“樹形結(jié)構(gòu)”。那么問題來了:

如何將一組帶有 parent_id 的平鋪數(shù)據(jù)結(jié)構(gòu),轉(zhuǎn)換成嵌套的樹形結(jié)構(gòu)?

思路拆解

思路非常清晰,但你得理解三個關(guān)鍵步驟:

  • 建立映射表:將所有數(shù)據(jù)按 id 索引,方便查找每一條記錄。
  • 遍歷數(shù)據(jù):根據(jù) parent_id 判斷每一條記錄的“父節(jié)點(diǎn)”。
  • 掛載子節(jié)點(diǎn):如果找到了父節(jié)點(diǎn),把自己加入它的 children 列表;如果沒有,就作為“頂級節(jié)點(diǎn)”。

完整代碼實(shí)現(xiàn)(可直接運(yùn)行)

from typing import List, Dict, Any
import json


def build_comment_tree(comments: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
    """
    將扁平化評論列表轉(zhuǎn)換為樹形結(jié)構(gòu)

    :param comments: 包含 id 和 parent_id 的評論列表
    :return: 嵌套的評論樹
    """
    # 初始化映射表,key 為 id,value 是評論內(nèi)容 + 空的 children
    comment_map = {
        comment["id"]: {**comment, "children": []}
        for comment in comments
    }

    tree = []

    for comment in comment_map.values():
        parent_id = comment.get("parent_id")
        if parent_id is None:
            # 頂級評論,放到根列表中
            tree.append(comment)
        else:
            # 子評論,找到它的父節(jié)點(diǎn)并掛載
            parent = comment_map.get(parent_id)
            if parent:
                parent["children"].append(comment)
            else:
                # parent_id 找不到對應(yīng)評論,可選處理方式
                tree.append(comment)  # 或記錄異常日志

    return tree


# 示例評論數(shù)據(jù)
if __name__ == "__main__":
    comment_list = [
        {"id": 1, "parent_id": None, "content": "頂級評論"},
        {"id": 2, "parent_id": 1, "content": "這是對1的回復(fù)"},
        {"id": 3, "parent_id": 1, "content": "我也是對1的回復(fù)"},
        {"id": 4, "parent_id": 2, "content": "回復(fù)2"},
        {"id": 5, "parent_id": None, "content": "另一個頂級評論"}
    ]

    tree_result = build_comment_tree(comment_list)

    # 打印格式化的結(jié)果
    print(json.dumps(tree_result, ensure_ascii=False, indent=2))

運(yùn)行結(jié)果展示(部分)

[
  {
    "id": 1,
    "parent_id": null,
    "content": "頂級評論",
    "children": [
      {
        "id": 2,
        "parent_id": 1,
        "content": "這是對1的回復(fù)",
        "children": [
          {
            "id": 4,
            "parent_id": 2,
            "content": "回復(fù)2",
            "children": []
          }
        ]
      },
      {
        "id": 3,
        "parent_id": 1,
        "content": "我也是對1的回復(fù)",
        "children": []
      }
    ]
  },
  {
    "id": 5,
    "parent_id": null,
    "content": "另一個頂級評論",
    "children": []
  }
]

常見應(yīng)用場景

  • 評論/回復(fù)樓層嵌套顯示
  • 組織架構(gòu)樹(部門-員工)
  • 欄目分類目錄(如博客、CMS)
  • 后臺權(quán)限菜單(父子菜單結(jié)構(gòu))

可拓展功能建議

  • 加入排序字段(比如按時間或點(diǎn)贊數(shù)排序)
  • 限制最大層級,避免無限遞歸(防止性能問題)
  • 構(gòu)建 ID → 子節(jié)點(diǎn) 的倒排索引,提高構(gòu)建效率(適合超大數(shù)據(jù))

小結(jié)

將扁平結(jié)構(gòu)轉(zhuǎn)為樹形結(jié)構(gòu),在評論系統(tǒng)、后臺管理系統(tǒng)中非常常見,這段代碼簡潔高效,可直接應(yīng)用于實(shí)際項(xiàng)目。

建議你將這段邏輯封裝成一個工具模塊或類,在多個項(xiàng)目中復(fù)用,省時省力!

責(zé)任編輯:趙寧寧 來源: Ssoul肥魚
相關(guān)推薦

2020-08-13 09:23:59

瀏覽器Chrome下載

2010-01-06 09:54:59

2022-09-06 11:53:00

開發(fā)計(jì)算

2021-06-28 20:01:07

電腦性能Windows 7

2012-02-01 15:41:42

2021-01-25 05:41:25

Flash Fliqlo軟件

2020-09-16 06:08:10

Linux文本比對代碼

2022-08-09 11:46:58

Vue遞歸組件

2011-05-03 11:13:51

黑盒

2020-06-22 14:18:02

運(yùn)維架構(gòu)技術(shù)

2020-10-20 08:01:30

MySQL密碼Windows

2022-06-21 09:27:01

PythonFlaskREST API

2023-12-18 08:24:09

LinuxPythonWord

2024-05-17 08:19:53

jackson數(shù)組切片

2019-01-23 10:11:43

Python爬蟲IP

2018-10-10 14:34:27

ARM嵌入式系統(tǒng)硬件

2021-07-06 07:21:17

橋接模式組合

2020-11-03 16:36:36

Windows微軟彈窗

2020-11-17 06:43:16

安卓智能手機(jī)移動應(yīng)用

2018-06-27 10:10:34

APP評分彈窗蘋果
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 成人一区二区视频 | 国产福利小视频 | 国产欧美一区二区三区在线看 | 日本免费在线 | 五月香婷婷| 久久在线精品 | 欧美精品中文字幕久久二区 | 中文在线a在线 | 日韩精品激情 | 拍真实国产伦偷精品 | 亚洲性视频 | 日韩中文一区 | 久久久久久www | 999国产精品视频 | 日本 欧美 国产 | 国产精品毛片一区二区在线看 | a在线视频观看 | 亚洲精品久久久久久久久久久久久 | 亚洲在线一区 | 亚洲国产欧美在线人成 | 一区二区三区免费观看 | www.久久久久久久久久久 | 国产在线资源 | 亚洲成av片人久久久 | 精品久久久久久久久久久 | 2023亚洲天堂| www.日韩免费 | 日韩欧美一区二区三区免费看 | 福利av在线 | 精品免费国产视频 | 成人在线看片 | 久久精品一级 | 成人久久久 | 永久av| 日韩一区二区三区在线观看视频 | 久草视频观看 | 国产在线视频一区二区 | 成人一区二区视频 | 亚洲一区精品在线 | 国产欧美日韩视频 | 九九色综合 |