在nodejs应用程序中,我有一个事件对象数组,格式如下:
eventsArray = [ {id: 1, date: 1387271989749 }, {id:2, date: 1387271989760}, ... ]
eventsArray具有可变长度的n个元素,假设我选择时间参考为巴黎时间,我希望能够按天,周或月分组元素:
groupedByDay = { 2012: { ... }, 2013: { dayN : [{id: a0, date: b0}, {id: a1, date: b1}, {id: a2, date: b2 }], dayN+1: [{id: a3, date: b3}, {id: a4, date: b4}, {id: a5, date: b5 }], ... }, 2014: { ... } } groupedByWeek = { 2012: { ... } 2013: { weekN: [{id: a0, date: b0}, {id: a1, date: b1}, {id: a2, date: b2 }], weekN+1: [{id: a3, date: b3}], .... }, 2014: { ... } } groupedByMonth = { 2012: { ... }, 2013: { monthN: [ {id: a0, date: b0 }, {id: a1, b1}, {id: a2, b2}, {id: a3, b3 }], monthN+1: [ {id: a4, date: b4 }, {id: a5, b5}, {id: a6, b6}], ... }, 2014: { ... } }
由于没有很好的操作unix时间戳的经验,我想知道如何做到这一点,或者是否有一个npm模块可以使这更容易.
以上所有解决方案都是高质量,纯粹的JS,香草解决方案.如果你可以使用几个库,那么lodash和moment可以一起用于简单的一个衬里:
let groupedResults = _.groupBy(results, (result) => moment(result['Date'], 'DD/MM/YYYY').startOf('isoWeek'));
var groupedResults = _.groupBy(results, function (result) { return moment(result['Date'], 'DD/MM/YYYY').startOf('isoWeek'); });
这将导致一个在本周开始时键入的数组,例如Mon Jul 25 2016 00:00:00 GMT+0100
.我相信你可以找出如何扩展它以获得数月,数年等.
在评论中提到,这不直接回答问题,因为原始使用UTC时间戳而不是格式化日期.在这种情况下,您应该使用moment()
没有第二个参数:
moment(1387271989749).startOf('isoWeek');
或者,如果使用UNIX时间戳,如下所示:
moment.unix(yourTimestamp).startOf('isoWeek');
...虽然这已经开始从问题中得到更多,但更多的是Moment文档,如果您想使用此方法,我建议您阅读.
这是我的解决方案.请记住,日期,周和月相对于原点,因为时代:
eventsArray = [ {id: 1, date: 1387271989749 }, {id:2, date: 1387271989760} ]; byday={}; byweek={}; bymonth={}; function groupday(value, index, array) { d = new Date(value['date']); d = Math.floor(d.getTime()/(1000*60*60*24)); byday[d]=byday[d]||[]; byday[d].push(value); } function groupweek(value, index, array) { d = new Date(value['date']); d = Math.floor(d.getTime()/(1000*60*60*24*7)); byweek[d]=byweek[d]||[]; byweek[d].push(value); } function groupmonth(value, index, array) { d = new Date(value['date']); d = (d.getFullYear()-1970)*12 + d.getMonth(); bymonth[d]=bymonth[d]||[]; bymonth[d].push(value); } eventsArray.map(groupday); eventsArray.map(groupweek); eventsArray.map(groupmonth);