2017-01-23 2 views
1

У меня есть массив объектов с разными TimeStamps, которые представляют собой Moment-Objects из MomentJS.Javascript Group Array by Interval

[ 
    { 
    "name": "A", 
    "eventDateTime": "2016-12-09 07:50:17", 
    }, 
    { 
    "name": "B", 
    "eventDateTime": "2016-12-09 06:50:17", 
    }, 
    { 
    "name": "C", 
    "eventDateTime": "2016-12-09 07:01:17", 
    } 
] 

Теперь то, что мне нужно сделать (Есть обычно больше этих объектов) является первым сортировать их, а затем группа затем с помощью 15-минутного интервала.

Так отсортирован я должен получить

[ 
    { 
    "name": "B", 
    "eventDateTime": "2016-12-09 06:50:17", 
    }, 
    { 
    "name": "C", 
    "eventDateTime": "2016-12-09 07:01:17", 
    }, 
    { 
    "name": "A", 
    "eventDateTime": "2016-12-09 07:50:17", 
    }] 

А потом мне нужно сгруппировать их, начиная с первым объектом со временем 06:50:17. Таким образом, это будет моя первая группа, в которую должны быть добавлены все объекты, которые находятся между 06:50:17 и 07:05:17. Поскольку массив отсортирован, я могу просто перебрать, пока один объект не станет старше 07:05:17.

В целом, это не трудно понять, однако оно должно быть максимально эффективным. Мы используем Lodash.js, который имеет много функциональных возможностей. Я знаю метод groupBy, но не как A) использовать MomentJS и B) Определить внутри него функцию, которая проверяет интервалы.

У вас есть несколько советов?

ответ

0

var data = [{ 
 
    "name": "A", 
 
    "eventDateTime": "2016-12-09 07:50:17", 
 
}, { 
 
    "name": "B", 
 
    "eventDateTime": "2016-12-09 06:50:17", 
 
}, { 
 
    "name": "C", 
 
    "eventDateTime": "2016-12-09 07:01:17", 
 
}]; 
 
var sortedDate = _.sortBy(data, function(o) { 
 
    return o.eventDateTime; 
 
}); 
 

 
var groupTime = null; // new Date(new Date(sortedData[0].eventDateTime).getTime() + 15 * 60000); 
 
var groupedData = _.groupBy(sortedDate, function(d) { 
 
    // no need to do this if eventDateTime is already a Date object 
 
    var time = new Date(d.eventDateTime); 
 
    // you can remove this condition and initialize groupTime with [0].eventDateTime 
 
    if (!groupTime) groupTime = new Date(time.getTime() + 15 * 60000); 
 
    return time - groupTime <= 900000 ? groupTime : groupTime = time; 
 
}); 
 

 
// modify the groupedData keys however u want 
 
console.log(groupedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

Смежные вопросы