javascript - 在 .map() 函数内的第一个键之前附加一个元素
问题描述
我想重新创建类似whatsapp/telegram 的时间线,其中消息按天数划分。
为了在 React 中呈现消息,我使用 Object.key(messages).map 函数。
Object.keys(this.messages).map(e => {
return <div key={i++}>
{ this.messages[e] }
如何在昨天的最后一条消息和今天的第一条消息之间添加例如“今天”?
解决方案
我会将所有消息分组到单独的数组中,每个数组对应发生的每一天。为了做到这一点,创建一个对象——它的键将是唯一的日子,它的值——来自这些日子的消息。
// object similar to your 'messages' state
const messages = {
message1: {
body: "one day before message",
time: 1534433188201
},
message2: {
body: "newest message",
time: 1534519588201
},
message3: {
body: "2 days before newest message",
time: 1534346788201
},
message4: {
body: "also 2 days before newest message",
time: 1534346788250
}
};
// creating array from your object
const messagesArray = Object.keys(messages).map(m => messages[m]);
// sorting array - oldest to newest
const latestMessages = messagesArray.sort((a, b) => a.time > b.time);
// grouping by date - create an object, each key is a different date and value is an array of messages from that day
const groupedByDate = {};
latestMessages.forEach(message => {
const date = new Date(message.time);
const day = date.getDate();
const month = date.getMonth();
const year = date.getFullYear();
// this will create 'date_17-7-2018' format as an example - you can do whatever you want/need here
const key = `date_${day}-${month}-${year}`;
// push message to existing key or create new array containing this message
if(groupedByDate[key]) {
groupedByDate[key].push(message);
} else {
groupedByDate[key] = [message];
}
});
console.log(groupedByDate);
渲染部分现在看起来很容易 - 这是一个我将如何处理的示例:
映射Object.keys(groupedByDate)
每个键返回div
或span
使用className="date-label"
(示例)。如果从这个键中提取的一天等于(new Date()).getDate()
- 渲染“今天”,如果是(new Date()).getDate() - 1
- 渲染“昨天”,否则渲染“X天前”。现在在这个map
循环中,您还需要map
覆盖groupedByDate[key]
(今天的消息数组)并呈现消息。
推荐阅读
- javascript - “onclick”在我的弹出按钮中不起作用(MapoboxGL)
- vuejs3 - Vue 3选项卡不呈现childeren
- java - ResponseEntity 未从 JSON 解析某些布尔值和字符串值(不一致)
- javascript - 如何处理 javascript 中的 256 位数字并对它们执行按位运算?
- spring - 无法在 Spring Boot Hibernate Search Elasticsearch 中配置我自己的分析器
- c# - 如何使用 SQL Server 在 ASP.NET 中创建图表
- go - 非结构类型如何扩展结构函数
- javascript - 通过覆盖元素类的定义来禁用某些元素的创建
- php - 根据订单状态在 WooCommerce 管理订单列表中隐藏订单(表格行)
- javascript - 当用户单击 vue.js 中的更多图标时如何获取选项?