Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS中的自定义排序_Javascript_Angularjs_Sorting - Fatal编程技术网

Javascript AngularJS中的自定义排序

Javascript AngularJS中的自定义排序,javascript,angularjs,sorting,Javascript,Angularjs,Sorting,我需要对如下所示的对象进行排序: {id: x, startDate:"mm/yyyy", endDate:"mm/yyyy", title:"xxxx", ...} {id: y, startDate:"mm/yyyy", endDate:"", title:"xxxx", ...} 我希望使用endDate对对象进行排序(最近一次排序先结束)。结束日期也可以为空,在这种情况下,对象仍处于活动状态,需要位于顶部。如果结束日期相等,则应按开始日期排序,最新日期排在第一位 我不能做简单的字符串比

我需要对如下所示的对象进行排序:

{id: x, startDate:"mm/yyyy", endDate:"mm/yyyy", title:"xxxx", ...}
{id: y, startDate:"mm/yyyy", endDate:"", title:"xxxx", ...}
我希望使用
endDate
对对象进行排序(最近一次排序先结束)。结束日期也可以为空,在这种情况下,对象仍处于活动状态,需要位于顶部。如果结束日期相等,则应按开始日期排序,最新日期排在第一位

我不能做简单的字符串比较,因为2013年10月比2010年2月更近。因此,比较应该同时适用于开始日期和结束日期、年份(
date.substring(3,7)
)和月份(
date.substring(0,2)

编辑

我认为:

ng-repeat="project in ProfileController.person.projects|orderBy:dateSorter"
在我的控制器中:

$scope.dateSorter = function(project) {
    return project.endDate.length ? -"9999" : -project.endDate.substring(3,7);
};

它可以按年度末的降序对项目进行正确排序。现在我需要考虑月份,以及在结束日期相同的情况下的开始日期。

您可以为Array.prototype.sort()提供一个比较函数。您应该为其提供一个实现订购规范的功能,如下所示:

function mmYyyyToDate(mmYyyy) {
    return new Date(mmYyyy.substring(3,7), mmYyyy.substring(0, 2))
}

function compares(a, b) {
    if (a.endDate && b.endDate) {
        var aEndDate = mmYyyyToDate(a.endDate);
        var bEndDate = mmYyyyToDate(b.endDate);
        return aEndDate == bEndDate ? 0 : aEndDate < bEndDate ? -1 : 1
    } else if (a.endDate) { return -1; }
    } else if (b.endDate { return 1; }
    } else {
        var aStartDate = mmYyyyToDate(a.startDate);
        var bStartDate = mmYyyyToDate(b.startDate);
        return aStartDate == bStartDate ? 0 : aStartDate < bStartDate ? -1 : 1;
    }
}
函数mmyyyyytode(mmYyyy){
返回新日期(mmYyyy.子字符串(3,7),mmyyy.子字符串(0,2))
}
函数比较(a,b){
if(a.endDate和b.endDate){
var aEndDate=mmYyyyToDate(a.endDate);
var bEndDate=mmyyyyytode(b.endDate);
返回aEndDate==bEndDate?0:aEndDate
如果需要对阵列进行排序以供显示,您可以在过滤器中实现该功能;如果您希望随时对数据进行排序,则可以在控制器中调用该功能或提供服务。

HTML:

<table class="friend">
    <tr>
      <th>Id</th>
      <th><a href="" ng-click="order('startDate', reverse); reverse=!reverse">Start Date</a></th>
      <th><a href="" ng-click="order('endDate',reverse);reverse=!reverse">End Date</a></th>
      <th>Title</th>  
    </tr>
    <tr ng-repeat="item in items"> 
      <td>{{item.id}}</td>
      <td>{{item.startDate | date:'MM-yyyy'}}</td> 
      <td>{{item.endDate }}</td>
      <td>{{item.title }}</td>
    </tr>
  </table>
angular.module('myApp', [])
.controller('MyController', function($scope,$filter){      
   var orderBy = $filter('orderBy');         
   $scope.items = [
                  {id: 1, startDate:"02/2010", endDate:"02/2010", title:"Title1"},
                  {id: 2, startDate:"01/2010", endDate:"01/2010", title:"Title2"};
                 ];                  
   $scope.order = function(predicate, reverse) {
       $scope.items = orderBy($scope.items, predicate, reverse);
   };

});

是什么导致您出现问题?我编辑了问题我知道,但问题是我不知道如何实现此功能这不是我的问题所在。我需要能够(1)处理空的结束日期字符串(2)考虑到这些都是日期,所以你不能做简单的字符串比较。如果你添加plunker/fiddle,我将有助于我们回答你的问题。