如何自定排序然后在angularjs中进行子排序?

时间:2017-04-17 21:31:03

标签: javascript angularjs sorting angularjs-ng-repeat

假设我有一系列像这样的对象:

[
        {
            name: 'test1',
            status: 'pending',
            date: 'Jan 17 2017 21:00:23'
        },
        {
            name: 'test2',
            status: 'pending',
            date: 'Jan 14 2017 21:00:23'
        },
        {
            name: 'test3',
            status: 'active',
            date: 'Jan 10 2017 21:00:23'
        }
    ];

我首先要根据" status"进行排序。所有项目都在"待定"在[" active"之前)应该来到(我还有其他状态,所以orderBy名称DESC无法工作。)

后来我想根据日期降序来重新定位它们。

在我的角度脚本中,我有一个定义为sortField的变量:

$scope.sortField = ['status', '-date']; 

(不起作用,因为Active在Pending之前排序)

我的html中有这个:

<li ng-repeat="form in forms | orderBy:sortField:isAsc " class="row {{Contextual}}" style="margin-bottom: 2px;">
    ...
</li>

我一直在尝试在线搜索但无法到达任何地方。你如何自定义一个字段&#34; status&#34;正常排序另一个&#34;日期&#34;?

1 个答案:

答案 0 :(得分:0)

orderBy过滤器使用表达式来计算顺序。您可以将字符串或函数作为表达式传递。此外,您可以将数组作为表达式传递,并且数组可以包含字符串/函数谓词。

也就是说,您可以定义自定义排序函数并传入数组:

<li ng-repeat="form in forms | orderBy: [statusOrder, '-date']">

控制器:

$scope.statusOrder = function(item) {
   if (item.status === 'pending') {
     return 1; // smaller value means this should be placed first
   } else {
      return 2; // all other statuses not 'pending' should be returned as is
   }
}

修改

关于日期顺序不正确,Angular按字母顺序对日期进行排序,因为日期是字符串。您有两种选择:

  1. 更新数组源,使日期字符串成为日期对象。这是更有效的范围明智。

    angular.forEach($scope.array, function(item) { item.date = new Date(item.date) })

  2. 像处理状态一样创建自定义dateSort函数。该功能应该只是return new Date(item.date)

  3. 更新小提琴: https://jsfiddle.net/51bsbzL0/258/