Групповые даты на основе временных меток - PullRequest
1 голос
/ 13 июля 2020

У меня есть массив меток времени, когда приложение использовалось в следующем формате, например: July 8, 2020 at 10:10:48 AM UTC+2, мне нужно написать код, который группирует каждую метку времени на основе количества дней a go приложение использовалось (1 день, 5 дней, 7 дней, 10 дней или больше) и подсчитайте, сколько устройств было на основе групп. Я изо всех сил пытаюсь заставить это работать. Пока у меня есть код для расчета количества дней между двумя датами, но я не уверен, как я могу сгруппировать и подсчитать.

function daysDifference(date1, date2) 
 {

  var difference=(date2.getTime() - date1.getTime()) / 1000;
  difference/= (60 * 60 * 24);
  return Math.abs(Math.round(difference));
  
 }

Любая помощь или совет будут очень благодарны.

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете

  • перемещаться по исходному массиву строк даты с помощью Array.prototype.reduce() анализа каждого элемента с помощью конструктора Date() и вычисления разницы между итоговая дата и текущая дата
  • с дельтой в днях (не обязательно целым числом), вы можете использовать Array.prototype.find(), чтобы получить наименьший интервал результирующей дельты, или назначить 'more' в качестве ключа, если совпадений не найдено
    const src = Array.from(
            {length: 10},
            () => new Date(Date.now()-15*864e5+Math.random()*15*864e5).toString()),           
              // above is just mocking the source data - array filled with 
              // date  strings (random dates up to 15 days from now)
              
          result = src.reduce((r,dateStr) => {
            const today = new Date(),
                  date = new Date(dateStr),
                  deltaDays = (today-date)/864e5,
                  key = [1,3,5,7].find(n => deltaDays <= n)||'more'
            r[key] = (r[key]||0)+1
            return r
          }, {})
          
    console.log('Source data: ', JSON.stringify(src))
    console.log('Result :', result)
    .as-console-wrapper{min-height:100%;}
0 голосов
/ 13 июля 2020

Предполагая, что вы хотите вернуть только количество (не группировки):

const dates = [
  new Date('July 12, 2020 00:15:30'),
  new Date('July 12, 2020 03:15:30'),
  new Date('July 07, 2020 02:15:30'),
  new Date('July 02, 2020 01:15:30'),
  new Date('July 08, 2020 12:15:30'),
  new Date('July 07, 2020 00:15:30'),
  new Date('July 07, 2020 03:15:30'),
  new Date('July 01, 2020 00:15:30')
]

const today = new Date();


function daysDifference(date1, date2) {
  var difference = (date2.getTime() - date1.getTime()) / 1000;
  difference /= (60 * 60 * 24);
  return Math.abs(Math.round(difference))

}


function countDifferences(arr, constant) {
  return arr.reduce((output, date) => {
    let key = daysDifference(date, constant);
    output[key] ? output[key] += 1 : output[key] = 1;
    return output
  }, {})
}

console.log(countDifferences(dates,today))
...