В чате VK подряд идущие сообщения одного человека рисуются одной пачкой: аватар один раз, время у последнего. Сообщения догружаются страницами по 50, и страницы иногда приходят не по порядку.
Напишите groupMessages(messages, gapMs). Сообщение — { id, from, ts }, ts в миллисекундах. Сначала упорядочьте по ts, при равном ts — по id. Исходный массив не меняйте.
Сообщение продолжает пачку, если автор тот же, от предыдущего сообщения прошло не больше gapMs и оба в одном дне по UTC. Иначе начинается новая пачка. Вернуть массив { from, ids }.
В работе: Окно переписки: 1 200 сообщений в беседе, 40 пачек на экран, перерисовка при каждой догрузке.
Пример 1: две пачки по автору
[{"id": 1, "from": "Оля", "ts": 0}, {"id": 2, "from": "Оля", "ts": 60000}, {"id": 3, "from": "Дима", "ts": 90000}], 300000{"res": [{"from": "Оля", "ids": [1, 2]}, {"from": "Дима", "ids": [3]}], "untouched": true}Пример 2: пауза считается от предыдущего
[{"id": 1, "from": "Оля", "ts": 0}, {"id": 2, "from": "Оля", "ts": 240000}, {"id": 3, "from": "Оля", "ts": 480000}], 300000{"res": [{"from": "Оля", "ids": [1, 2, 3]}], "untouched": true}groupMessages — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 7: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function groupMessages(messages, gapMs) // → { from, ids }[]
Источник: на задачах VK: мессенджер, лента сообщений. Условие пересказано своими словами.
Ожидаемый ответ не нужен: покажем, что вернула функция.
Здесь появится результат отправки.