如何合并Papaparse解析的含重复Post值数组的对应Comment项
问题原因
.map() 的设计定位是做数组一对一映射转换,遍历每一项返回对应新值,最终返回和原数组长度一致的新数组,本身不支持跨项聚合、分组类的逻辑,所以你之前的思路跑不通是正常的。
另外你描述的目标结构存在JS语法错误:对象不能直接在顶层平级放置多个无键名的对象,实际可用的合理归并结构应该是每个Post条目下挂一个Comments数组,存储所有关联的评论对象,格式参考:
[ { Post: 'post1', Comments: [ { Comment: 'comment1' }, { Comment: 'comment2' }, { Comment: 'comment3' } ] }, { Post: 'post2', Comments: [ { Comment: 'comment1' }, { Comment: 'comment2' }, { Comment: 'comment3' } ] } ]
这个结构后续遍历发起API请求也更方便,不需要额外做格式转换。
实现方案
通用分组方案(不要求相同Post行连续)
用Array.reduce做聚合是最简洁的写法,不需要提前对CSV排序,相同Post的行哪怕分散在文件各处也能正确归并:
// 替换成你用Papaparse解析得到的原始数组 const parsedCsvData = [{Post: 'post1', Comment: 'comment1'}, {Post: 'post1', Comment: 'comment2'} /* 其余解析结果 */] const groupedResult = parsedCsvData.reduce((accumulator, currentItem) => { // 查找结果里是否已经存在当前Post对应的条目 const existingPostEntry = accumulator.find(entry => entry.Post === currentItem.Post) if (existingPostEntry) { // 条目已存在,直接追加评论 existingPostEntry.Comments.push({ Comment: currentItem.Comment }) } else { // 条目不存在,初始化新的Post条目存入结果 accumulator.push({ Post: currentItem.Post, Comments: [{ Comment: currentItem.Comment }] }) } return accumulator }, []) // 聚合初始值为空数组
如果你的CSV数据量很大,reduce里每次find遍历会产生额外性能损耗,可以用哈希对象做映射优化,时间复杂度更低:
const postHash = {} const groupedResult = [] for (const item of parsedCsvData) { if (!postHash[item.Post]) { const newEntry = { Post: item.Post, Comments: [] } postHash[item.Post] = newEntry groupedResult.push(newEntry) } postHash[item.Post].Comments.push({ Comment: item.Comment }) }
相邻判断方案(仅适合同Post行连续的场景)
如果你的CSV和示例一样,相同Post的所有行都是连续排列的,也可以用你最开始想的相邻值判断逻辑,用普通for循环实现即可。但要注意如果CSV后续调整了排序,相同Post的行被打散,这个逻辑就会出现归并错误,优先选用上面的通用分组方案:
const groupedResult = [] for (let i = 0; i < parsedCsvData.length; i++) { const current = parsedCsvData[i] if (i === 0 || current.Post !== parsedCsvData[i-1].Post) { // 是第一个元素,或者和上一个Post值不同,新建条目 groupedResult.push({ Post: current.Post, Comments: [{Comment: current.Comment}] }) } else { // 和上一个Post值相同,追加到最后一个条目的评论数组 groupedResult.at(-1).Comments.push({Comment: current.Comment}) } }
内容的提问来源于stack exchange,提问作者Dylan L.
相关产品推荐
相关产品推荐

