Oposum
@Oposum

Как перебрать из массива до тех пор, пока совпадают даты?

У меня есть объекты, в которых есть время записи. Объектов очень много, поэтому проходить циклом по всем записям считаю ресурсо-затратным. Собственно вопрос: как перебрать массив и выйти из него, при условии что дата берется из самой последней записи.
Например, нужно вывести в консоли вроде такого
"18.10.2020 - всего 2 записи, id-2 и id-3"

пример массива:
var array = [
{id: 1, date: 1600329223354}, //17.09.2020
{id: 2, date: 1603001365232}, //18.10.2020
{id: 3, date: 1603001365297} //18.10.2020
];
  • Вопрос задан
  • 202 просмотра
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Во-первых, массив надо отсортировать по датам, если он у вас уже не упорядочен. В любом языке программирования есть какая-то функция sort(), которой можно как-то задать, как сравнивать сортируемые объекты (тут вам надо сравнивать только даты).

Ваше условие не очень понятно, но вот, как сгрупировать массив по датам:
st = 0; 
end = 0;
while (st < a.length) {
  end = st + 1;
  while(end < a.length && a[end].date == a[end-1].date) end++;
  console.log(a[st].date);
  for (st = st; st < end; st++) {
    console.log(a[st].id);
  }
}


Тут мы просто откусываем от массива кусок с одинаковыми датами, пока массив не кончится. Если вам нужна только последняя группа, то можно откусить только один раз с конца:
end = a.length - 1;
st = end - 1;
while (st >= 0 && a[st].date == a[st+1].date) st--;
console.log(a[end].date);
for (st = st+1; st <= end; ++st) 
  console.log(a[st].id);


Только учтите, этот код не работает на пустом массиве. Надо отдельно проверить этот случай.
Ответ написан
@naruto3333
я думаю сначала нужно найти минимальный и максимальный timestamp даты, затем попробовать бинарным поиском отсекать куски, запоминая последний курсор. с каждым отсечением следить за тем, чтобы мы не проскочили искомый период таймстемпов - если мы ищем 18 число, а предыдущий курсор был на 19 числе, а на текущем курсоре мы стоим на 17 числе - то период за 18 число проскочен, и берем тогда этот интервал, и продолжаем уже в нем бинарный поиск.

когда курсор будет на 18 числе в моем примере, начинаем идти от него вниз и вверх циклом for(..;..;..), пока не упремся в границы интервала с обоих сторон
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы