成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用JS將聊天記錄聚合在一起

開發(fā) 前端
我們在QQ上聊天時,同一分鐘的聊天記錄會被放在一起展示,當我們發(fā)送消息時,每條消息的發(fā)送時間都會精確到秒,那么他是如何實現(xiàn)將這些數(shù)據(jù)按分鐘劃分到一起的顯示的呢?

 [[359156]]

前言

我們在QQ上聊天時,同一分鐘的聊天記錄會被放在一起展示,當我們發(fā)送消息時,每條消息的發(fā)送時間都會精確到秒,那么他是如何實現(xiàn)將這些數(shù)據(jù)按分鐘劃分到一起的顯示的呢?

今天在給我開源項目的聊天記錄添加消息發(fā)送時間展示時,正好遇到了這個問題,一開始想不明白應該如何處理這些數(shù)據(jù),后來經(jīng)過一番思考后,終于有了實現(xiàn)思路,將其實現(xiàn)了,本文就跟大家分享下我的實現(xiàn)思路以及過程,歡迎各位感興趣的開發(fā)者閱讀本文。

實現(xiàn)思路

先跟大家看下我的數(shù)據(jù),如下所示:

  1. [{ 
  2.  "createTime""2020-12-21 20:58:19"
  3.  "avatarSrc""https://www.kaisir.cn/uploads/1ece3749801d4d45933ba8b31403c685touxiang.jpeg"
  4.  "msgId""121710f399b84322bdecc238199d6888"
  5.  "msgText""/壞笑/"
  6.  "userName""神奇的程序員"
  7.  "userId""c04618bab36146e3a9d3b411e7f9eb8f"
  8.  "status"false 
  9. }, { 
  10.  "createTime""2020-12-21 20:58:22"
  11.  "avatarSrc""https://www.kaisir.cn/uploads/1ece3749801d4d45933ba8b31403c685touxiang.jpeg"
  12.  "msgId""121710f399b84322bdecc238199d6888"
  13.  "msgText""還有人嗎"
  14.  "userName""神奇的程序員"
  15.  "userId""c04618bab36146e3a9d3b411e7f9eb8f"
  16.  "status"false 
  17. }, { 
  18.  "createTime""2020-12-21 20:58:46"
  19.  "avatarSrc""https://www.kaisir.cn/uploads/1ece3749801d4d45933ba8b31403c685touxiang.jpeg"
  20.  "msgId""121710f399b84322bdecc238199d6888"
  21.  "msgText""聊天記錄,添加了消息發(fā)送時間"
  22.  "userName""神奇的程序員"
  23.  "userId""c04618bab36146e3a9d3b411e7f9eb8f"
  24.  "status"false 
  25. }, { 
  26.  "createTime""2020-12-21 20:58:52"
  27.  "avatarSrc""https://www.kaisir.cn/uploads/1ece3749801d4d45933ba8b31403c685touxiang.jpeg"
  28.  "msgId""121710f399b84322bdecc238199d6888"
  29.  "msgText""現(xiàn)在看起來就方便多了"
  30.  "userName""神奇的程序員"
  31.  "userId""c04618bab36146e3a9d3b411e7f9eb8f"
  32.  "status"false 
  33. }, { 
  34.  "createTime""2020-12-21 21:35:27"
  35.  "avatarSrc""https://www.kaisir.cn/uploads/1ece3749801d4d45933ba8b31403c685touxiang.jpeg"
  36.  "msgId""121710f399b84322bdecc238199d6888"
  37.  "msgText""/壞笑/"
  38.  "userName""神奇的程序員"
  39.  "userId""c04618bab36146e3a9d3b411e7f9eb8f"
  40.  "status"false 
  41. }] 

觀察上方數(shù)據(jù),我們發(fā)現(xiàn):每個消息對象都有一個createTime屬性,它是消息的發(fā)送時間,精確到了時分秒,現(xiàn)在我們要做的就是把同一分鐘的時間只保留一個createTime屬性,渲染時間的時候只渲染擁有createTime屬性的對象,這樣就做到了將相同分鐘的數(shù)據(jù)渲染到了一起。

大體思路就是這樣,接下來我們看下具體的思路:

  1. 聲明一個對象命名為timeObj,存放消息對象里createTime字段的年-月-日 時:分,聲明一個新的消息記錄數(shù)組finalTextList存放處理好的數(shù)據(jù)
  2. 遍歷消息記錄數(shù)組,獲取當前遍歷到的消息記錄對象
  3. 獲取遍歷到的消息記錄對象的createTime屬性,截取 年-月-日 時:分,聲明一個變量time來保存
  4. 判斷time是否存在于timeObj中
  5. 如果存在就刪除遍歷到的消息記錄對象中的createTime屬性,將刪除屬性后的消息記錄對象放進finalTextList中
  6. 否則將time作為屬性放進timeObj中,將遍歷到的消息記錄對象原封不動的放進finalTextList中

處理好數(shù)據(jù)后,我們在渲染時判斷當前渲染項里是否存在createTime,如果存在就渲染。

實現(xiàn)過程

接下來,我們在拿到接口返回的數(shù)據(jù)后將其按照上述思路進行處理。

處理接口返回的數(shù)據(jù)

如下所示res.data.messageTextList為接口返回的消息記錄列表。

  1. // 消息內(nèi)容列表 
  2. const messageTextList: Array<msgListType> = res.data.messageTextList; 
  3. // 處理好的消息內(nèi)容數(shù)組 
  4. const finalTextList: Array<msgListType> = []; 
  5. // 時間存放對象 
  6. const timeObj: { [key: string]: boolean } = {}; 
  7. // 處理消息內(nèi)容列表,同一分鐘的數(shù)據(jù)只保留一個創(chuàng)建時間 
  8. for (let i = 0; i < messageTextList.length; i++) { 
  9.     // 消息對象 
  10.     const messageObj = messageTextList[i]; 
  11.     // 獲取時間的 年-月-日 時:分 
  12.     const time = (messageObj.createTime as string).substring(0, 16); 
  13.     // timeObj中已經(jīng)存在time,則移除當前消息對象的createTime 
  14.     if (_.has(timeObj, time)) { 
  15.         // 移除createTime屬性 
  16.         _.unset(messageObj, "createTime"); 
  17.         // 將移除createTime屬性的消息對象放進處理好的消息數(shù)組中 
  18.         finalTextList.push(messageObj); 
  19.     } else { 
  20.         // 將time作為key放進timeObj中 
  21.         timeObj[time] = true
  22.         // 原封不動的將消息對象放進處理好的消息數(shù)組中 
  23.         finalTextList.push(messageObj); 
  24.     } 
  25. // 渲染消息列表 
  26. this.renderPage(finalTextList, {}); 

上述代碼中的msgListType為消息記錄對象的類型定義,has為lodash的方法用于判斷對象中是否包含某個屬性,unset也為lodash的方法用于移除對象中的某個屬性。

處理推送數(shù)據(jù)

收到服務端推送的數(shù)據(jù)時,我們要將服務端推送的消息聚合到已經(jīng)渲染的聊天記錄里,如果不是同一分鐘的消息則渲染新的時間,因此我們要取出當前推送消息的createTime字段,截取年-月-日 時:分判斷其是否在已渲染的消息記錄列表里,如果不存在則原封不動的渲染,否則就刪除createTime字段后渲染,代碼如下:

  1. // 接收到服務端推送的新消息,渲染單個消息對象 
  2. const thisSenderMessageObj: msgListType = { 
  3.     msgText: msgObj.msgText, 
  4.     avatarSrc: msgObj.avatarSrc, 
  5.     userId: msgObj.userId, 
  6.     userName: msgObj.userName, 
  7.     createTime: msgObj?.createTime 
  8. }; 
  9.  
  10. // 找到消息記錄列表中與新消息的同一分鐘的消息,移除新消息的createTime對象 
  11. for (let i = 0; i < this.senderMessageList.length; i++) { 
  12.     const messageObj: msgListType = this.senderMessageList[i]; 
  13.     // 截取當前消息與新消息發(fā)送時間的 年-月-日 時:分,判斷其是否相等 
  14.     if (_.isEqual(    messageObj.createTime?.substring(0,16),thisSenderMessageObj.createTime?.substring(0, 16))) { 
  15.         // 移除新消息的createTime屬性 
  16.         _.unset(thisSenderMessageObj, "createTime"); 
  17.    } 
  18.  
  19. // 解析并渲染 
  20. this.messageParsing(thisSenderMessageObj); 

msgObj為服務端推送的消息

渲染頁面

接下來我們看看頁面的渲染代碼,如下所示,只渲染對象中包含createTime屬性的數(shù)據(jù)

  1. <!--消息發(fā)送時間--> 
  2. <div class="snder-time-panel" v-if="item.createTime"
  3.   <span>{{ item.createTime.substring(5, 16) }}</span> 
  4. </div> 

實現(xiàn)效果

最后我們來看看實現(xiàn)的效果,如下所示:

我們再來發(fā)送一條消息看看效果,如下所示:圖片太大此處無法顯示,請在尾部閱讀原文進行查看。

項目地址

代碼地址:message-display.vue

在線體驗地址:chat-system

本文轉載自微信公眾號「 神奇的程序員k」,作者 神奇的程序員k 。轉載本文請聯(lián)系 神奇的程序員k公眾號。

 

責任編輯:武曉燕 來源: 神奇的程序員k
相關推薦

2022-05-06 14:19:02

邊緣計算物聯(lián)網(wǎng)5G

2021-03-15 10:26:29

邊緣計算云計算混合云

2016-03-31 13:22:51

UbuntuFreeBSD發(fā)行版

2020-09-16 11:20:40

PythonBashLinux

2014-08-12 09:54:35

Web語言編程語言

2020-05-27 11:18:44

安全風險數(shù)據(jù)

2021-09-07 09:43:02

云計算開源架構

2021-05-12 09:40:31

5G邊緣計算網(wǎng)絡

2023-10-27 16:17:49

云計算企業(yè)

2020-11-23 08:00:00

機器人工具RPA

2020-03-20 09:30:03

物聯(lián)網(wǎng)人工智能技術

2022-11-30 09:25:28

2020-12-14 06:48:42

Redis記錄轉存

2023-03-30 16:23:09

人工智能AI

2018-02-01 21:18:40

戴爾

2013-05-31 09:03:47

SkypeLync集成

2009-11-06 08:57:31

WCF開發(fā)

2013-08-06 09:49:01

2016-08-12 09:49:06

Intel

2023-11-30 15:23:07

聚合查詢數(shù)據(jù)分析
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 播放一级黄色片 | 国产一区二区三区四区hd | 98成人网| 欧美一级久久精品 | 亚洲成人精品一区 | 中文字幕成人av | 精品一区二区三区四区外站 | 99精品视频在线观看 | 一区二区三区四区国产 | 亚洲国产精品自拍 | 国产一区二区精品在线 | 日本一区高清 | 黑人巨大精品欧美一区二区免费 | 精品国产久 | 日本a视频| 黄色一级大片在线观看 | 成人精品鲁一区一区二区 | 一区二区在线免费播放 | 国产精品一区二区无线 | 三级在线观看 | 国产一区二区视频免费在线观看 | 国产精品久久一区二区三区 | 99精品免费 | 日韩成人精品一区 | 先锋影音资源网站 | 久久久青草婷婷精品综合日韩 | 欧美亚洲国产一区 | 中午字幕在线观看 | 欧美日韩久久 | 亚洲久久在线 | 久久亚洲天堂 | 免费成人高清在线视频 | 综合久久99 | 视频一区二区中文字幕 | 国产成人av在线播放 | 国产精品久久久久久久白浊 | 祝你幸福电影在线观看 | 91精品国产一区二区三区蜜臀 | 日韩在线观看中文字幕 | 免费黄色av | 99免费在线视频 |