2017-01-23 55 views
1

我有一个带有不同TimeStamps的对象数组,它们是来自MomentJS的Moment-Objects。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", 
    }] 

然后我需要将它们分组开始与时间6点50分17秒的第一个对象。所以这将是我第一个应该添加所有对象的组,这些对象在06:50:17和07:05:17之间。由于数组已被排序,我可以迭代直到一个对象早于07:05:17。总而言之,这并不难,但它应该尽可能高效。我们使用具有许多功能的Lodash.js。我知道groupBy方法,但不知道如何使用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>