使用AngularJS和MomentJS按月重复ng-repeat

时间:2014-11-13 16:36:28

标签: javascript angularjs momentjs

我有一个包含如下对象的数组:

{
"date":"11/11/2014",
"time":"17.20.37",
"car":"396",
"driver":"Jenny",
"from":"Old Office",
"destination":"Log WH",
"pax":"3","comment":"",
"commenttime":"",
"arrival":"17.20.48",
"inserted":true,
"cancelled":"",
"duration":"00:00:11"
}

我想要完成的是按月自动列出项目,如下所示:

-November 2014

   ng-repeat with records from 11-14

-October 2014

   ng-repeat with records from 10-14

我知道这涉及通过数组并将所有具有共同属性(同月和年)的项目聚集在一起。

我已经使用汽车代码执行此操作,列出了不同的独特汽车代码,如下所示:

var carsDict = {};

angular.forEach($scope.recordlist, function(record) {
  carsDict[record.car] = carsDict[record.car] || [];
  carsDict[record.car].push(record);
});

$scope.carstats = carsDict;

这段代码为每个唯一的汽车代码(record.car)创建一个对象数组。

我可以对record.date属性(这是一个moment()对象)执行相同的操作,但它会将所有具有相同确切日期的对象组合在一起,而不是同一个月和年。

有关如何实现这一目标的任何想法吗?

修改

这是我到目前为止的JSFiddle。在示例中,我列出了每辆车的汽车代码,行程(阵列中的每个对象都是行程)和道路上的时间(所有记录的总和)。

现在它进行计算并显示recordlist的所有对象的结果,但下一步是做同样的事情,但是按月自动列出。

1 个答案:

答案 0 :(得分:2)

对于每个记录列表,您需要创建年月字典(2014-11):

var monthsDict = {};

angular.forEach(records, function(record) {
  var month = moment(record.date).format('YYYY-MM');
  monthsDict[month] = monthsDict[month] || [];
  monthsDict[month].push(record);
});

如果您需要,可以对其进行排序:

var sortDates = function(a,b) { return moment(a.date) - moment(b.date); };

angular.forEach(monthsDict, function(month) {
  month.sort(sortDates);
});