javascript - 如何按消息日期和用户将消息分组
问题描述
我正在尝试创建一个脚本命令,它将存储频道的消息并将其重新创建到一个 HTML 页面中,但是我对其进行排序的方式不起作用。这是我到目前为止所拥有的
let msgs = totalMessages
let sorted = []
for (let i = 0; msgs.length; i++) {
let msgGroup = [msgs[0]]
for (let a in msgs) {
if (msgs[a].time <= first.time + 5 && msgs[a].name == first.name) msgGroup.push(msgs[a])
else break
}
msgs = msgs.slice(msgGroup.length)
sorted[i] = msgGroup
}
以下是总消息的示例:
let messages = [{'name': 'user1', 'time': '5:00pm'},
{'name': 'user1', 'time': '5:01pm'},
{'name': 'user1', 'time': '5:09pm'},
{'name': 'user2', 'time': '5:11pm'},
{'name': 'user2', 'time': '5:12pm'},
{'name': 'user1', 'time': '5:13pm'},
{'name': 'user2', 'time': '5:14pm'},
{'name': 'user2', 'time': '5:15pm'},
{'name': 'user2', 'time': '5:25pm'}]
这是我期望的输出
[[{'name': 'user1', 'time': '5:00pm'},
{'name': 'user1', 'time': '5:01pm'}],
[{'name': 'user1', 'time': '5:09pm'}],
[{'name': 'user2', 'time': '5:11pm'},
{'name': 'user2', 'time': '5:12pm'},],
[{'name': 'user1', 'time': '5:13pm'}],
[{'name': 'user2', 'time': '5:14pm'},
{'name': 'user2', 'time': '5:15pm'}],
[{'name': 'user2', 'time': '5:25pm'}]
]
我这样做的方式是,第一条消息将放在一个组中,如果下一条消息比第一条消息早 10 分钟,并且消息作者相同,则将其添加到组中,如果不是,则创建带有该消息的新消息组并从原始数组中删除组中的消息,我已经尝试修复它,但我无法制作或找到有效的解决方案,有人可以帮助我吗?
解决方案
我希望这对你有帮助。
getMinutes
将字符串时间转换为分钟
getGroups
将数据分组
let messages = [{ 'name': 'user1', 'time': '5:00pm' },
{ 'name': 'user1', 'time': '5:01pm' },
{ 'name': 'user1', 'time': '5:09pm' },
{ 'name': 'user2', 'time': '5:11pm' },
{ 'name': 'user2', 'time': '5:12pm' },
{ 'name': 'user1', 'time': '5:13pm' },
{ 'name': 'user2', 'time': '5:14pm' },
{ 'name': 'user2', 'time': '5:15pm' },
{ 'name': 'user2', 'time': '5:25pm' }]
function getMinutes(time = "") {
var minutes = 0;
try {
minutes = time.endsWith("pm") ? 720 /* 12 hours */ : 0;
var t = time.replace("pm", "").replace("am", "").split(":")
minutes = minutes + (parseInt(t[0]) * 60) + parseInt(t[1]);
} catch (ex) { }
return minutes;
}
function getGroups(data) {
var result = [];
if (data.length) {
var firstItemOfGroup = data[0];
var group = [firstItemOfGroup];
for (let i = 1; i < data.length; i++) {
if (data[i].name !== firstItemOfGroup.name ||
getMinutes(data[i].time) - getMinutes(firstItemOfGroup.time) > 10) {
if (group.length) result.push(group) // add group to result
group = []; // init new group
firstItemOfGroup = data[i];
}
group.push(data[i])
}
if (group.length) {
result.push(group)
}
}
return result;
}
console.log(getGroups(messages))
推荐阅读
- android - 下载管理器更新应用程序,但失败
- c# - 如何保存对象变量供 ASP.NET 应用程序的所有用户使用,该变量被触发一次
- svg - SVG 使用 - 旋转后无法重新定位多边形
- amazon-web-services - Amazon SageMaker 分解机器评级矩阵和终端节点
- sql - 如何附加列,分组且不重复?
- r - 如何在 R 中引导混合效应模型
- google-analytics - 如何使用 Tealium/GA 衡量使用 URL 片段的单页网站?
- php - 我的代码中的什么导致了以下错误:PHP 致命错误:未捕获的错误:在 null 上调用成员函数 begin()?
- python-3.x - Python 3.6+ 可以是字符串或任何类的参数注释
- service-worker - Workbox 不能在 localhost 上工作,但它可以在 127.0.0.1 上工作