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
相关产品推荐
相关产品推荐

