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

如何为聊天消息数组添加日期与协议标识对象?

聊天消息数组添加日期与协议信息的修正方案

需求规则

  • 当天的第一条消息前,添加日期类型的info对象,结构为{type: "info", date: "YYYY-MM-DD"}
  • 协议变更前(下一条消息协议不同时)、聊天结束时,添加协议类型的info对象,结构为{type: "info", protocol: "协议编号"}

输入示例

const chatMessages = [  
  {
    "protocol": "9313478261",
    "msgDate": "2024-01-30T12:58:32"
  },
  {
    "protocol": "9313478261",
    "msgDate": "2024-01-30T13:05:10"
  },
  {
    "protocol": "8765432109",
    "msgDate": "2024-01-31T09:20:00"
  },
  {
    "protocol": "8765432109",
    "msgDate": "2024-01-31T10:15:30"
  }
];

预期输出

const modifiedMessages = [  
  {
    "type": "info",
    "date": "2024-01-30"
  },
  {
    "protocol": "9313478261",
    "msgDate": "2024-01-30T12:58:32"
  },
  {
    "protocol": "9313478261",
    "msgDate": "2024-01-30T13:05:10"
  },
  {
    "type": "info",
    "protocol": "9313478261"
  },
  {
    "type": "info",
    "date": "2024-01-31"
  },
  {
    "protocol": "8765432109",
    "msgDate": "2024-01-31T09:20:00"
  },
  {
    "protocol": "8765432109",
    "msgDate": "2024-01-31T10:15:30"
  },
  {
    "type": "info",
    "protocol": "8765432109"
  }
];

现有代码的问题

  1. 日期对象格式错误:输出的是{info: true},不符合预期的{type: "info", date: "YYYY-MM-DD"}结构;且使用toDateString()依赖本地化环境,可能导致日期判断不准确
  2. 协议对象逻辑错误:
    • 首次循环时lastProtocol为null,会错误添加{protocol: null}的无效对象
    • 协议对象未按要求定义为type: "info"的结构
    • 协议变更时的添加时机逻辑混乱,未实现“变更前添加”的要求

修正后的代码

let lastProtocol = null;
let currentDateStr = null;

const modifiedMessages = chatMessages.reduce((acc, message) => {
  const messageDate = new Date(message.msgDate);
  // 格式化日期为YYYY-MM-DD,避免本地化问题
  const dateStr = `${messageDate.getFullYear()}-${String(messageDate.getMonth() + 1).padStart(2, '0')}-${String(messageDate.getDate()).padStart(2, '0')}`;
  const messageProtocol = message.protocol;

  // 处理日期:当天第一条消息前添加日期info
  if (!currentDateStr || dateStr !== currentDateStr) {
    acc.push({ type: "info", date: dateStr });
    currentDateStr = dateStr;
  }

  // 处理协议变更:当前消息协议与上一个不同时,先添加上一个协议的info
  if (lastProtocol !== null && lastProtocol !== messageProtocol) {
    acc.push({ type: "info", protocol: lastProtocol });
    lastProtocol = messageProtocol;
  }

  // 首次设置协议(第一条消息时)
  if (lastProtocol === null) {
    lastProtocol = messageProtocol;
  }

  acc.push(message);
  return acc;
}, []);

// 聊天结束时添加最后一个协议的info
if (lastProtocol !== null) {
  modifiedMessages.push({ type: "info", protocol: lastProtocol });
}

console.log(modifiedMessages);

代码说明

  1. 日期处理:手动格式化日期为YYYY-MM-DD格式,避免toDateString()的本地化差异,确保日期判断准确;同时生成符合要求的日期info对象
  2. 协议处理:
    • 首次循环时仅初始化lastProtocol,不添加无效对象
    • 当后续消息协议变更时,先添加上一个协议的info对象(满足“变更前添加”的要求)
    • 循环结束后,添加最后一个协议的info对象,覆盖“聊天结束时”的需求
  3. 所有info对象统一使用type: "info"标识,区分日期和协议类型的附加信息

内容的提问来源于stack exchange,提问作者Nilton Schumacher F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:08:33