You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 }
  ]
}

原代码问题分析

你之前的代码存在两个核心问题:

  1. 合并逻辑错误:currMs.content.push(nextMs)是将整个消息对象推入content数组,而非合并content里的元素,正确操作应该是推入nextMs.content中的元素。
  2. 连续项处理不完整:仅比较当前项与下一项,没有持续追踪正在合并的目标对象,导致超过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));

逻辑说明

  1. 初始化空数组mergedMessages用于存储合并后的结果。
  2. 遍历原始消息数组,每次取出当前消息msg。
  3. 检查mergedMessages的最后一项:
    • 如果存在且isSender与当前消息相同,将当前消息的content元素扩展合并到最后一项的content中。
    • 如果不存在或isSender不同,将当前消息的副本加入结果数组。
  4. 遍历完成后,mergedMessages即为合并后的目标数组。

内容的提问来源于stack exchange,提问作者jackewiehose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:50:26