Angularjs groupBy orderBy

新手上路,请多包涵

我正在使用 angular-filter 中的 groupBy 按对象的日期属性对对象数组进行分组。

 <div ng-repeat="(day, dayEvents) in events | groupBy: 'date' )">
 <h3>{{ day | date: mediumDate }}</h3>
</div>

产生以下内容:

 Feb 9, 2015
Feb 10, 2015
Feb 11, 2015
Feb 12, 2015

我怎样才能将订单从最近的日期开始?当我打印到控制台时,数组以我想要的顺序打印:

   Object {
     1423699200000: Array[1],
     1423612800000: Array[7],
     1423526400000: Array[11],
     1423440000000: Array[1]
 }

我还写了一个自定义过滤器来反转 groupBy 之后的顺序:

 .filter("reverseOrder", function() {
        function sortNumber(a,b) {
            return  parseInt(b) - parseInt(a);
        }
        return function(collection) {
            var keys = Object.keys(collection).sort(sortNumber);
            var reveredCollection= {};
            var length=collection.length;
            angular.forEach(keys, function(key) {
                reveredCollection[key] = collection[key];
            });
           return reveredCollection;
        }
    })

我这样申请的:

 <div ng-repeat="(day, dayEvents) in events | groupBy: 'date' | reverseOrder )">
     <h3>{{ day | date: mediumDate }}</h3>
</div>

原文由 cksrc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 366
2 个回答

最近有同样的问题。 groupBy 创建一个对象,但是 orderBy 需要一个数组,所以有一点时髦。我最终直接从他们的问题页面得到了答案,其中一位作者用基本上是复制/粘贴的代码示例很好地解释了它。

https://github.com/a8m/angular-filter/issues/57#issuecomment-65041792

原文由 aron.duby 发布,翻译遵循 CC BY-SA 3.0 许可协议

似乎 正确的 方法是使用 | toArray: true | orderBy: customMappingFunction ,但是,我发现这方面的表现很糟糕。我想出了一个解决方案,可以保持性能并产生正确的结果——(尽管它看起来有点奇怪!)

 <div ng-repeat="(key, results) in allResults | groupBy: '-someKey' )">
    <h3>{{ key | ltrim: '-' }}</h3>
    <ul>
        <li ng-repeat="result in results">
            {{ result }}
        </li>
    </ul>
</div>

无论出于何种原因,添加 - 确实会强制 groupBy 正确排序,但它也会将其添加到 key 中,所以我们可以删除它!

原文由 Roi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏