首页 > 解决方案 > 如何按消息日期和用户将消息分组

问题描述

我正在尝试创建一个脚本命令,它将存储频道的消息并将其重新创建到一个 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 分钟,并且消息作者相同,则将其添加到组中,如果不是,则创建带有该消息的新消息组并从原始数组中删除组中的消息,我已经尝试修复它,但我无法制作或找到有效的解决方案,有人可以帮助我吗?

标签: javascriptsortinggrouping

解决方案


我希望这对你有帮助。
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))

推荐阅读