我正在尝试根据消息状态添加两个对象。
当是当天的第一条消息时,它将在该消息之前添加一个包含日期的对象。如果下一条消息具有不同的协议,或者聊天已结束,则将添加协议。
这就是物体:
const chatMessages = [
{
"protocol": "9313478261",
"msgDate": "2024-01-30T12:58:32"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T12:58:44"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:25"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:35"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-31T10: 50: 26"
},
{
"protocol": "9313478261",
"msgDate": "2024-02-02T11: 18: 21"
},
{
"protocol": "39128391231",
"msgDate": "2024-02-03T12:58:32"
},
{
"protocol": "39128391231",
"msgDate": "2024-02-03T13:58:32"
},
{
"protocol": "87382713812",
"msgDate": "2024-02-03T14:58:32"
},
{
"protocol": "87382713812",
"msgDate": "2024-02-03T15:58:32"
},
]
这就是我想要实现的目标:
const chatMessages = [
{
"type": "info",
"date": "2024-01-30"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T12:58:44"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:25"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:35"
},
{
"type": "info",
"date": "2024-01-31"
},
{
"protocol": "9313478261",
"msgDate": "2024-01-31T10: 50: 26"
},
{
"type": "info",
"date": "2024-02-02"
},
{
"protocol": "9313478261",
"msgDate": "2024-02-02T11: 18: 21"
},
{
"type": "info",
"date": "Protocol is 9313478261"
},
{
"type": "info",
"date": "2024-02-03"
},
{
"protocol": "39128391231",
"msgDate": "2024-02-03T12:58:32"
},
{
"protocol": "39128391231",
"msgDate": "2024-02-03T13:58:32"
},
{
"type": "info",
"date": "Protocol is 39128391231"
},
{
"protocol": "87382713812",
"msgDate": "2024-02-03T14:58:32"
},
{
"type": "info",
"date": "2024-02-04"
},
{
"protocol": "87382713812",
"msgDate": "2024-02-04T15:58:32"
},
]
我的代码:
let lastProtocol = null;
let currentDate = null;
const modifiedMessages = chatMessages.reduce((acc, message) => {
const messageDate = new Date(message.msgDate);
const messageProtocol = message.protocol;
if (!currentDate || messageDate.toDateString() !== currentDate.toDateString()) {
acc.push({ info: true });
currentDate = messageDate;
}
if (lastProtocol !== messageProtocol) {
acc.push({ protocol: lastProtocol });
lastProtocol = messageProtocol;
}
acc.push(message);
return acc;
}, []);
modifiedMessages.push({ protocol: lastProtocol });
console.log(modifiedMessages);
但协议和日期未正确添加:
[{
"info": true
}, {
"protocol": null
}, {
"protocol": "9313478261",
"msgDate": "2024-01-30T12:58:32"
}, {
"protocol": "9313478261",
"msgDate": "2024-01-30T12:58:44"
}, {
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:25"
}, {
"protocol": "9313478261",
"msgDate": "2024-01-30T13:18:35"
}, {
"info": true
}, {
"protocol": "9313478261",
"msgDate": "2024-01-31T10: 50: 26"
}, {
"protocol": "9313478261",
"msgDate": "2024-02-02T11: 18: 21"
}, {
"info": true
}, {
"protocol": "9313478261"
}, {
"protocol": "39128391231",
"msgDate": "2024-02-03T12:58:32"
}, {
"protocol": "39128391231",
"msgDate": "2024-02-03T13:58:32"
}, {
"protocol": "39128391231"
}, {
"protocol": "87382713812",
"msgDate": "2024-02-03T14:58:32"
}, {
"protocol": "87382713812",
"msgDate": "2024-02-03T15:58:32"
}, {
"protocol": "87382713812"
}]
首先,我研究了一个将所有日期格式化为相同模式的解决方案 - 这对于将要推送的新对象很有用。
之后,我格式化了日期,删除了“T”、小时、分钟和秒。最后,我又插入了一个协议分析条件。这是我为达到预期结果所做的事情:
let lastProtocol = null;
let currentDate = null;
const modifiedMessages = chatMessages.reduce((acc, message) => {
// following a pattern to every incoming date
const messageDate = new Date(message.msgDate.split(' ').join(''));
const messageProtocol = message.protocol;
if (!currentDate || messageDate.toDateString() !== currentDate.toDateString()) {
// formatting date before pushing
acc.push({ type: "info", date: messageDate.toISOString().split('T')[0]});
currentDate = messageDate;
}
// look at the last condition below
if (lastProtocol !== messageProtocol && lastProtocol !== null) {
acc.push({ protocol: lastProtocol });
lastProtocol = messageProtocol;
}
acc.push(message);
return acc;
}, []);