格式化聊天消息数组以添加协议和日期

问题描述 投票:0回答:1

我正在尝试根据消息状态添加两个对象。

当是当天的第一条消息时,它将在该消息之前添加一个包含日期的对象。如果下一条消息具有不同的协议,或者聊天已结束,则将添加协议。

  1. 协议对象始终会在协议更改之前添加
  2. 日期将添加在当天的第一条消息之前

这就是物体:

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"
}] 
javascript arrays typescript react-native object
1个回答
0
投票

首先,我研究了一个将所有日期格式化为相同模式的解决方案 - 这对于将要推送的新对象很有用。

之后,我格式化了日期,删除了“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;
}, []);
© www.soinside.com 2019 - 2024. All rights reserved.