@Azperin
Дилетант

Проверка на вхождение в диапозон цифр или if-hell?

Как правильно делаются такие проверки на вхождение в определенный интервал цифр или дат ?
Допустим есть 500 каких-то событий, у них записано время в unixtime. Какой самый оптимальный способ посчитать и отобразить события за последние 14 дней от текущего времени ?
Пока у меня идея только такая
//создаем сразу массив с нужными данными
var datesArray = [];
var currentTime = Date.now;
var i = 13; 
var timeInterval = 86400; //сутки
for(;i--;) {
  datesArray.push( currentTime - timeInterval * i )
};
//и вторым циклом перебирать уже массив событий
i = 0
for(;i < events.length; i++) {
  if (events.time >= datesArray[13] && events.time < datesArray[12] ) {
  //событие было 13 дней назад
  } else if (events.time >= datesArray[12] && events.time < datesArray[11] ) {
  //событие было 12 дней назад
  } else if ( events.time >= datesArray[11] && events.time < datesArray[10] ) {
  //событие было 11 дней назад
  };
//ну и так далее, думаю смысл понятен
}

Есть ли какой-нибудь более оптимальный способ это делать и насколько может просесть производительность, если таких событий будет 10к+ ?
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 3
Immortal_pony
@Immortal_pony Куратор тега JavaScript
moment.js поможет вам в работе с датами.

Пример:

var dates = [1520608921, 1520522534, 1512400948, 1521037358, 1521814967];
var fourteenDaysAgo = moment().subtract(14, 'days').format('X');
var filteredDates = dates.filter(function(date) { 
	return date > fourteenDaysAgo;
});
Ответ написан
LaRN
@LaRN
Senior Developer
А откуда вы получаете эти события?
Если из бд, может проще это решить(отбор событий по дате) на уровне запроса к бд.
Ответ написан
@epifanB
инженер
Я бы делал как-то так:
const events = [
  {id:1, time: 10},
  {id:2, time: 11},
  {id:3, time: 15},
  {id:4, time: 14},
  {id:5, time: 13}
];
const bottom_limit = 11;
const result = events
                .filter( event => event.time >= bottom_limit )
                .sort( (first, second) => first.time - second.time );

>Есть ли какой-нибудь более оптимальный способ это делать и насколько может просесть производительность, если таких событий будет 10к+ ?
Можно использовать setTimeout, за раз перебирать часть массива (https://learn.javascript.ru/settimeout-setinterval... или использовать web workers (https://developer.mozilla.org/ru/docs/Web/API/Web_...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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