如何用JavaScript合并JSON中isSender连续相同的消息项?
合并连续相同
isSender属性的消息项 需求说明
需要将JSON数据中isSender属性连续相同的消息项合并,把这些项的content数组合并为一个数组,保留isSender属性。
原始数据:
{ "messages": [ { "content": ["Foo"], "isSender": true }, { "content": ["Bar"], "isSender": true }, { "content": ["Lorem"], "isSender": true }, { "content": ["Ipsum"], "isSender": true }, { "content": ["Dolor"], "isSender": false }, { "content": ["Sit Amet"], "isSender": false }, { "content": ["No"], "isSender": true } ] }
期望输出:
{ "messages": [ { "content": ["Foo", "Bar", "Lorem", "Ipsum"], "isSender": true }, { "content": ["Dolor", "Sit Amet"], "isSender": false }, { "content": ["No"], "isSender": true } ] }
原代码问题分析
你之前的代码存在两个核心问题:
- 合并逻辑错误:
currMs.content.push(nextMs)是将整个消息对象推入content数组,而非合并content里的元素,正确操作应该是推入nextMs.content中的元素。 - 连续项处理不完整:仅比较当前项与下一项,没有持续追踪正在合并的目标对象,导致超过2个连续相同项时,后续项无法合并到同一个对象中。
正确解决方案
通过维护一个结果数组,遍历原始消息时,始终与结果数组的最后一项对比isSender属性,实现连续项的合并:
const originalMessages = [ { "content": ["Foo"], "isSender": true }, { "content": ["Bar"], "isSender": true }, { "content": ["Lorem"], "isSender": true }, { "content": ["Ipsum"], "isSender": true }, { "content": ["Dolor"], "isSender": false }, { "content": ["Sit Amet"], "isSender": false }, { "content": ["No"], "isSender": true } ]; const mergedMessages = []; for (const msg of originalMessages) { const lastMerged = mergedMessages[mergedMessages.length - 1]; // 如果结果数组已有项,且最后一项的isSender与当前项一致,合并content if (lastMerged && lastMerged.isSender === msg.isSender) { lastMerged.content.push(...msg.content); } else { // 否则将当前项加入结果数组(使用扩展运算符复制对象,避免修改原数据) mergedMessages.push({ ...msg }); } } // 输出合并后的结果 console.log(JSON.stringify({ messages: mergedMessages }, null, 2));
逻辑说明
- 初始化空数组
mergedMessages用于存储合并后的结果。 - 遍历原始消息数组,每次取出当前消息
msg。 - 检查
mergedMessages的最后一项:- 如果存在且
isSender与当前消息相同,将当前消息的content元素扩展合并到最后一项的content中。 - 如果不存在或
isSender不同,将当前消息的副本加入结果数组。
- 如果存在且
- 遍历完成后,
mergedMessages即为合并后的目标数组。
内容的提问来源于stack exchange,提问作者jackewiehose
相关产品推荐
相关产品推荐

