类似于this related question,我要对一组对象进行分组,e.g., by team name
[
{name: 'Gene', team: 'team alpha'},
{name: 'George', team: 'team beta'},
{name: 'Steve', team: 'team gamma'},
{name: 'Paula', team: 'team beta'},
{name: 'Scruath of the 5th sector', team: 'team gamma'}
];
不幸的是,accepted answer与ng-repeat
过滤器一起使用groupBy
似乎在Angular Material扩展面板中似乎不起作用,这是我想做的:
我想要多个扩展面板,每个团队一个,当扩展时会显示参与的玩家。
我尝试过
<mat-expansion-panel ng-repeat="(key, value) in players | groupBy: 'team'">
<mat-expansion-panel-header>
<mat-panel-title>{{ key }}</mat-panel-title>
</mat-expansion-panel-header>
<li ng-repeat="player in value">
{{player.name}}
</li>
</mat-expansion-panel>
但是,ng-repeat
内不允许mat-expansion-panel
。允许使用*ngFor
,但我不知道如何将其与groupBy
过滤器一起使用。 *ngFor="let player in players | groupBy: 'team'"
引发错误,我找不到任何文档。
答案 0 :(得分:2)
您应该制作自己的 custom pipe
以支持GroupBy,而且ng-repeat是angularjs语法,您应该使用 ngFor
。
您的自定义管道应为,
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({name: 'groupBy'})
export class GroupByPipe implements PipeTransform {
transform(collection: Array<any>, property: string): Array<any> {
if(!collection) {
return null;
}
const groupedCollection = collection.reduce((previous, current)=> {
if(!previous[current[property]]) {
previous[current[property]] = [current];
} else {
previous[current[property]].push(current);
}
return previous;
}, {});
return Object.keys(groupedCollection).map(key => ({ key, value: groupedCollection[key] }));
}
}