2016-10-05 88 views
0

我正在使用LoDash創建IndexedDB中某些記錄的統計數據。AngularJS:按ng-repeat日期排序,其中關鍵是日期

$scope.refreshStats = function() { 

    var dataByMonth = _.groupBy($scope.stats, function(record) { 
     return moment(record.date).format('MMMM YYYY'); 
    }); 

    dataByMonth = _.mapValues(dataByMonth, function(month) { 
     var obj = {}; 
     obj.Cars = _.groupBy(month, 'car'); 
     obj.Drivers = _.groupBy(month, 'driver'); 

     _.each(obj, function(groupsValue, groupKey) { 
      obj[groupKey] = _.mapValues(groupsValue, function(groupValue) { 
       return _.reduce(groupValue, function(sum, trip) { 
        sum['trips']++; 
        sum['duration']+= moment.utc(trip.duration, 'HH:mm:ss'); 
        sum['total'] = moment.utc(sum.duration). format('HH:mm:ss') 
        return sum; 
       }, {trips: 0, duration: 0, total:0}) 
      }); 
     }) 
     return obj; 
    }); 
    $scope.statistics = dataByMonth; 
    console.log($scope.statistics); 
}; 

從我的函數的結果是嵌套對象的集合,其關鍵是始終月份和年份:

Object { 
    July 2016: Object, 
    August 2016: Object, 
    September 2016: Object, 
    October 2016: Object 
} 

的問題是,當我在前臺顯示出來,第一個NG - 按月份分組的monthName將按字母順序排列(顯示8月 - 7月 - 9月 - 10月),到目前爲止,我還沒有弄清楚如何按日期訂購。

這裏的NG-重複的樣子:

<div ng-repeat="(monthName, monthValue) in statistics"> 

    {{monthName}} 

</div> 

有沒有辦法使用orderBy:date當日期是他們關鍵的對象?

編輯

,不重複的問題,我的問題是需要通過它來識別關鍵的日期,然後順序。對於所提及的問題的答案,我一直無法解決這個問題。

+1

http://stackoverflow.com/questions/14478106/angularjs-sorting-by-property –

回答

2

在JS對象主要訂單不能靠,你有你的數據轉換爲{日期:,值:}對象,並對其進行排序。

第一步,轉化率:

var step1 = _.map(_.pairs(dataByMonth), _.partial(_.zipObject, ['date', 'value'])); 

接下來,您需要對它們進行排序:

var step2 = _.sortBy(step1, function(value){ 
    return new Date(value.date); 
}); 

第二步握着你的排序值

$scope.statistics = step2; 

您可以在NG-使用重複

<div ng-repeat="montStats in statistics"> 

    {{monthStats.date}} 

</div> 

您可以進一步優化您的代碼:

記錄日期作爲一個真正的日期,避免由每個排序迭代解析。

鏈的操作:

_(dataByMonth).pairs().map(
    _.partial(_.zipObject, ['date', 'value'])).sortBy(function(value){ 
    return new Date(value); 
    }).value();