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

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

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

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

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

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

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

也就是所謂的“樹(shù)形結(jié)構(gòu)”。那么問(wèn)題來(lái)了:

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

思路拆解

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

  • 建立映射表:將所有數(shù)據(jù)按 id 索引,方便查找每一條記錄。
  • 遍歷數(shù)據(jù):根據(jù) parent_id 判斷每一條記錄的“父節(jié)點(diǎn)”。
  • 掛載子節(jié)點(diǎn):如果找到了父節(jié)點(diǎn),把自己加入它的 children 列表;如果沒(méi)有,就作為“頂級(jí)節(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]]:
    """
    將扁平化評(píng)論列表轉(zhuǎn)換為樹(shù)形結(jié)構(gòu)

    :param comments: 包含 id 和 parent_id 的評(píng)論列表
    :return: 嵌套的評(píng)論樹(shù)
    """
    # 初始化映射表,key 為 id,value 是評(píng)論內(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:
            # 頂級(jí)評(píng)論,放到根列表中
            tree.append(comment)
        else:
            # 子評(píng)論,找到它的父節(jié)點(diǎn)并掛載
            parent = comment_map.get(parent_id)
            if parent:
                parent["children"].append(comment)
            else:
                # parent_id 找不到對(duì)應(yīng)評(píng)論,可選處理方式
                tree.append(comment)  # 或記錄異常日志

    return tree


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

    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": "頂級(jí)評(píng)論",
    "children": [
      {
        "id": 2,
        "parent_id": 1,
        "content": "這是對(duì)1的回復(fù)",
        "children": [
          {
            "id": 4,
            "parent_id": 2,
            "content": "回復(fù)2",
            "children": []
          }
        ]
      },
      {
        "id": 3,
        "parent_id": 1,
        "content": "我也是對(duì)1的回復(fù)",
        "children": []
      }
    ]
  },
  {
    "id": 5,
    "parent_id": null,
    "content": "另一個(gè)頂級(jí)評(píng)論",
    "children": []
  }
]

常見(jiàn)應(yīng)用場(chǎng)景

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

可拓展功能建議

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

小結(jié)

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

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

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

2020-08-13 09:23:59

瀏覽器Chrome下載

2010-01-06 09:54:59

2022-09-06 11:53:00

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

2021-06-28 20:01:07

電腦性能Windows 7

2021-01-25 05:41:25

Flash Fliqlo軟件

2012-02-01 15:41:42

2022-08-09 11:46:58

Vue遞歸組件

2020-09-16 06:08:10

Linux文本比對(duì)代碼

2011-05-03 11:13:51

黑盒

2020-06-22 14:18:02

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

2022-06-21 09:27:01

PythonFlaskREST API

2020-10-20 08:01:30

MySQL密碼Windows

2023-12-18 08:24:09

LinuxPythonWord

2024-05-17 08:19:53

jackson數(shù)組切片

2019-01-23 10:11:43

Python爬蟲(chóng)IP

2021-07-06 07:21:17

橋接模式組合

2018-10-10 14:34:27

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

2020-11-03 16:36:36

Windows微軟彈窗

2018-06-27 10:10:34

APP評(píng)分彈窗蘋(píng)果

2022-02-17 17:19:31

鴻蒙語(yǔ)音識(shí)別語(yǔ)音播報(bào)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 色视频欧美 | 日日夜夜视频 | 久久成人国产精品 | 精品久久精品 | 国产精品高潮呻吟久久 | 曰批视频在线观看 | 最新中文字幕 | 一a一片一级一片啪啪 | 国产一区二区三区精品久久久 | 欧美一区二区三区视频在线 | 99久久日韩精品免费热麻豆美女 | 久久99精品久久久久子伦 | 国产九九精品 | 国产成人99久久亚洲综合精品 | 日本精品视频在线观看 | 国产美女黄色片 | 成人精品一区 | 国产视频h | 国产精品精品视频一区二区三区 | 亚洲精品一区二区网址 | 看av在线 | 国产激情视频网站 | 欧美激情视频一区二区三区在线播放 | 国产极品粉嫩美女呻吟在线看人 | 国产视频三级 | 亚洲成人精品在线 | 国产乱码一二三区精品 | 久久久久亚洲 | av色噜噜 | 亚洲精品国产a久久久久久 午夜影院网站 | 久草视| 久久亚洲一区二区三 | 99精品视频免费在线观看 | 亚洲欧美日韩精品久久亚洲区 | 天天夜干| 黑人粗黑大躁护士 | 久久久久久久久久久久久9999 | 成人免费视频观看视频 | 久久99精品久久 | 二区三区视频 | 97人人爱|