gpt4 book ai didi

javascript - 使用 *ngFor 将 Angular Material 中的对象数组分组

转载 作者:行者123 更新时间:2023-12-01 01:43:45 24 4
gpt4 key购买 nike

类似于this related question我想对一组对象进行分组例如按团队名称

[
{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 answerng-repeatgroupBy 过滤器一起使用似乎不适用于 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>

但是,mat-expansion-panel 内不允许使用 ng-repeat。允许使用 *ngFor ,但我不知道如何将其与 groupBy 过滤器一起使用。 *ngFor="let player inplayers | groupBy: 'team'" 抛出错误,我找不到任何文档。

最佳答案

你应该制作自己的自定义管道来支持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] }));
}
}

STACKBLITZ DEMO

关于javascript - 使用 *ngFor 将 Angular Material 中的对象数组分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52139874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com