You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发如何将平级评论接口数据转换为带children的一级嵌套评论模型

平级评论转1级嵌套结构实现方案

核心思路

总时间复杂度为O(n),仅用到额外的哈希映射表做中间存储,没有额外的时间开销:

  • 第一次遍历所有平级评论,完成两个操作:建立评论id到评论对象的映射表、筛选出所有id == root_comment_id的父评论存入最终结果数组
  • 第二次遍历所有平级评论,跳过父评论,直接通过root_comment_id从映射表中取出对应父评论,将当前回复追加到父评论的children数组即可

代码实现(Swift示例)

首先你的Comment模型需要将children声明为可修改的属性:

struct Comment: Codable {
    let id: Int
    let rootCommentId: Int
    // 其他业务字段:评论内容、发布用户ID、时间等
    var children: [Comment]? // 值类型需要声明为var才能修改内容
}

转换方法实现:

func flatToNestedComments(_ flatList: [Comment]) -> [Comment] {
    /// 评论ID到评论对象的映射表
    var commentMapper: [Int: Comment] = [:]
    /// 最终输出的嵌套父评论数组
    var parentComments: [Comment] = []
    
    // 第一次遍历:构建映射表 + 筛选父评论
    for item in flatList {
        commentMapper[item.id] = item
        if item.id == item.rootCommentId {
            parentComments.append(item)
        }
    }
    
    // 第二次遍历:挂载所有回复到对应父评论
    for reply in flatList {
        guard reply.id != reply.rootCommentId else { continue }
        let parentId = reply.rootCommentId
        // 过滤父评论不存在的异常数据
        guard var parent = commentMapper[parentId] else { continue }
        if parent.children == nil {
            parent.children = []
        }
        parent.children!.append(reply)
        // 更新映射表和父评论数组中的父对象(值类型需要手动更新)
        commentMapper[parentId] = parent
        if let parentIndex = parentComments.firstIndex(where: { $0.id == parentId }) {
            parentComments[parentIndex] = parent
        }
    }
    
    return parentComments
}

注意事项

如果你的Comment是class引用类型,不需要额外更新父评论数组的对象,修改映射表中的对象属性会直接同步到父评论数组的对应元素中,代码可以进一步简化。

内容的提问来源于stack exchange,提问作者Mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:54:03