NodeJS中WhatsApp导出聊天记录连续多条消息合并问题
解决WhatsApp连续相同发送者消息合并问题
问题根源
你的现有代码应该是采用了「合并当前与原数组下一条」的逻辑,每次仅处理相邻两条消息,遇到第三条及以上连续同发送者消息时,无法将其纳入已合并的条目,导致出现单独的冗余消息。
修正思路
维护一个结果数组,遍历每条消息时检查结果数组的最后一条消息的发送者是否与当前消息一致:
- 若一致,将当前消息的内容追加到最后一条的内容中(可根据需求选择保留第一条的时间或更新为最后一条的时间)
- 若不一致,将当前消息作为新条目加入结果数组
修正代码
function mergeConsecutiveMessages(messages) { if (!messages || messages.length === 0) return []; // 初始化结果数组,浅拷贝第一条消息避免修改原数据 const merged = [{...messages[0]}]; for (let i = 1; i < messages.length; i++) { const currentMsg = messages[i]; const lastMergedMsg = merged[merged.length - 1]; if (currentMsg.sender === lastMergedMsg.sender) { // 追加当前消息内容,可根据需求调整换行符或格式 lastMergedMsg.content += `\n${currentMsg.content}`; // 若需要保留最新的消息时间,取消下面注释: // lastMergedMsg.timestamp = currentMsg.timestamp; } else { // 浅拷贝当前消息加入结果数组 merged.push({...currentMsg}); } } return merged; }
测试验证
示例输入数据
[ {"sender": "Alice", "content": "Hi", "timestamp": 1620000000}, {"sender": "Alice", "content": "How are you?", "timestamp": 1620000010}, {"sender": "Alice", "content": "I'm fine thanks", "timestamp": 1620000020}, {"sender": "Bob", "content": "Hey there", "timestamp": 1620000030} ]
当前错误输出
[ {"sender": "Alice", "content": "Hi\nHow are you?", "timestamp": 1620000000}, {"sender": "Alice", "content": "I'm fine thanks", "timestamp": 1620000020}, {"sender": "Bob", "content": "Hey there", "timestamp": 1620000030} ]
修正后期望输出
[ {"sender": "Alice", "content": "Hi\nHow are you?\nI'm fine thanks", "timestamp": 1620000000}, {"sender": "Bob", "content": "Hey there", "timestamp": 1620000030} ]
注意事项
- 如果需要保留每条消息的完整元数据(比如每条的单独时间),可以将
content字段改为数组存储,后续按需拼接:// 初始化时 const merged = [{...messages[0], content: [messages[0].content]}]; // 合并时 lastMergedMsg.content.push(currentMsg.content); - 若原消息包含嵌套对象,建议使用深拷贝(如
JSON.parse(JSON.stringify(msg)))避免修改原数据。
内容的提问来源于stack exchange,提问作者MassEdits
相关产品推荐
相关产品推荐

