如何为聊天消息数组添加日期与协议标识对象?
聊天消息数组添加日期与协议信息的修正方案
需求规则
- 当天的第一条消息前,添加日期类型的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" } ];
现有代码的问题
- 日期对象格式错误:输出的是
{info: true},不符合预期的{type: "info", date: "YYYY-MM-DD"}结构;且使用toDateString()依赖本地化环境,可能导致日期判断不准确 - 协议对象逻辑错误:
- 首次循环时
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);
代码说明
- 日期处理:手动格式化日期为
YYYY-MM-DD格式,避免toDateString()的本地化差异,确保日期判断准确;同时生成符合要求的日期info对象 - 协议处理:
- 首次循环时仅初始化
lastProtocol,不添加无效对象 - 当后续消息协议变更时,先添加上一个协议的info对象(满足“变更前添加”的要求)
- 循环结束后,添加最后一个协议的info对象,覆盖“聊天结束时”的需求
- 首次循环时仅初始化
- 所有info对象统一使用
type: "info"标识,区分日期和协议类型的附加信息
内容的提问来源于stack exchange,提问作者Nilton Schumacher F
相关产品推荐
相关产品推荐

