AngularJS groupBy orderBy

AngularJS groupBy orderBy

使用 angular.filter 我正在使用 groupBy 和 length 来计算用户 emailId

记录的记录数
           <div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId'">
                 <h3>{{ key }} {{ filteredList.length}}</h3>
                 <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li>
           </div>

这一切都很好,给我一个电子邮件 ID 列表、每个电子邮件 ID 的记录数以及下面列出的记录。

我想做的是按每个 emailId 的记录数对数据进行排序(换句话说,按 {{ filteredList.length}} 返回的值对数据进行排序)。

我尝试将 orderBy 添加到 ng-repeat,如下所示

      <div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId' | orderBy: filtered.length">
             <h3>{{ key }} {{ filteredList.length}}</h3>
             <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li>
       </div>  

但这对列出项目的顺序没有任何影响。我已经在寻找现有的答案,但所有不与 groupBy 一起使用的 orderBy 似乎都指的是按值中包含的项目而不是过滤器的长度进行排序。

angular-filter 的用户组在下面link写了需要做的事情: https://github.com/a8m/angular-filter/issues/57#issuecomment-65041792

groupBy returns 一个对象,但 orderBy fiter 需要一个数组。所以使用 toArray:true 并给 orderBy 一个数组来处理。

下面是必须有效的代码:

   <div ng-repeat="(key, value) in leaderboard | groupBy: 'emailId' | toArray: true |orderBy: filtered.length">
         <h3>{{ key }} {{ filteredList.length}}</h3>
         <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li>
   </div>

此外,请记住 orderBy 必须是链接中的最后一个过滤器。

编辑

您还可以切换 orderBy 和 groupBy 的位置。如果 OrderBy 过滤器首先进行排序,然后 groupBy 过滤器在没有 toArray 过滤器的情况下初始化

示例:

<div ng-repeat="(key, value) in array | orderBy: filtered.length | groupBy: 'emailId'">
             <h3>{{ key }} {{ filteredList.length}}</h3>
             <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li>
       </div>

这很容易解决,只需先订购再分组。更好的性能。

<div ng-repeat="(key, value) in leaderboard | orderBy: filtered.length" | groupBy: 'emailId'>
    <h3>{{ key }} {{ filteredList.length}}</h3>
    <li ng-repeat="leaderboard in value | filter: emailId as filteredList"></li>
 </div>