Javascript如何基于cid匹配更新collection1的嵌套comments数组对象
错误原因
你的写法存在两个核心问题:
obj.comments是数组类型,不是单个对象,直接访问obj.comments._id会返回undefined,触发你遇到的类型错误- 你的需求是替换
collection1每个元素下的comments数组内部的子对象,而不是替换collection1的顶层元素,原有逻辑和需求不符
实现代码
推荐先将collection2预处理为映射表,避免嵌套循环重复查找,性能更好:
// 以cid为键生成映射表,查找时间复杂度O(1) const cidMap = new Map(collection2.map(item => [item.cid, item])) // 生成更新后的collection1,不修改原数据 const updatedCollection1 = collection1.map(topItem => { // 按原顺序替换comments数组的每个元素 const updatedComments = topItem.comments.map(comment => { return cidMap.get(comment._id) || comment }) return { ...topItem, comments: updatedComments } })
如果需要直接修改原collection1数据,可以简化为:
const cidMap = new Map(collection2.map(item => [item.cid, item])) collection1.forEach(topItem => { topItem.comments = topItem.comments.map(comment => cidMap.get(comment._id) || comment) })
逻辑说明
- 映射表预处理可以大幅提升大数据量下的处理效率,避免每次替换都遍历一次
collection2 - 内层
comments数组用map遍历,保证原顺序不变,匹配到就替换为collection2的对应对象,匹配不到则保留原comment对象
内容的提问来源于stack exchange,提问作者SeekerC
相关产品推荐
相关产品推荐

