You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase实时数据库中*ngFor排序作曲家作品的问题

解决作品列表字母排序问题

你的问题出在ngx-order-pipe的排序依据写法上——因为arrcompositions是通过Object.entries转换而来的二维数组(每个元素是[键名, 作品名]的数组),而你原来用的'composition[1]'是针对对象属性的语法,管道无法识别数组索引的这种写法。

下面给你两种可行的解决方案,推荐第一种(更高效,减少前端模板层的逻辑):

方案1:在获取数据时直接排序(推荐)

既然我们已经在服务里处理arrcompositions,不如在这里直接完成排序,避免在模板里额外处理。只需要在转换为数组后,调用sort方法,基于子数组的第二个元素(作品名)做字母排序:

getComposerWithKey(key: string): Observable<Composer> {
  const memberPath = `composer/${key}`;
  this.composer = this.db.object(memberPath)
    .snapshotChanges().map(action => {
      const $key = action.payload.key;
      // 先转换为数组,空值时用空数组替代null更安全
      let arrcompositions = action.payload.val().compositions ? Object.entries(action.payload.val().compositions) : [];
      // 按作品名字母升序排序,localeCompare支持多语言排序
      arrcompositions = arrcompositions.sort((a, b) => a[1].localeCompare(b[1]));
      const data = { $key, arrcompositions, ...action.payload.val() };
      return data;
    });
  return this.composer;
}

修改后,模板里不需要任何管道,直接用原来的*ngFor就能展示排序后的作品列表:

<mat-list-item *ngFor="let composition of composer.arrcompositions">
  {{ composition[1] }}
</mat-list-item>

方案2:正确使用ngx-order-pipe排序

如果你一定要用管道实现排序,需要给orderBy传递一个函数来指定排序依据(即每个数组元素的第二个值),而不是字符串:

<!-- 升序排序(默认) -->
<mat-list-item *ngFor="let composition of composer.arrcompositions | orderBy: [(item) => item[1]]">
  {{ composition[1] }}
</mat-list-item>

<!-- 如果需要降序,加上': desc' -->
<mat-list-item *ngFor="let composition of composer.arrcompositions | orderBy: [(item) => item[1]]: 'desc'">
  {{ composition[1] }}
</mat-list-item>

另外要确保你已经在模块中正确导入了OrderModule:

import { OrderModule } from 'ngx-order-pipe';

@NgModule({
  imports: [
    // ...其他模块
    OrderModule
  ]
})
export class YourModule { }

为什么原来的写法无效?

你之前写的orderBy: 'composition[1]'会让管道尝试去访问每个composition对象的composition[1]属性,但实际上每个composition是数组,并没有这个属性,所以管道无法找到排序依据,自然不会生效。

内容的提问来源于stack exchange,提问作者C. Banzet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:04:20