使用 *ngFor 数组排序

Posted

技术标签:

【中文标题】使用 *ngFor 数组排序【英文标题】:Orderby with *ngFor array 【发布时间】:2018-07-02 08:34:53 【问题描述】:

我使用 Firebase 实时数据库在我的 json 文件中创建了以下结构,以处理 Composer 和他的作品:

我有以下服务,可以为我提供一位作曲家及其作品的数据

getComposerWithKey(key: string): Observable<Composer> 
const memberPath = `composer/$key`;
this.composer = this.db.object(memberPath)
  .snapshotChanges().map(action => 
    const $key = action.payload.key;
    const arrcompositions = action.payload.val().compositions?Object.entries(action.payload.val().compositions):null;
    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>

我的问题是我无法按字母顺序排列作品。我尝试使用ngx-order-pipe,但我不知道如何精确用于订购的值

<mat-list-item *ngFor="let composition of composer.arrcompositions | orderBy: 'composition[1]'">
 composition[1] 

这显然行不通……

【问题讨论】:

【参考方案1】:

我用这个包:ngx-pipes.

npm i ngx-pipes

import NgPipesModule from 'ngx-pipes';

@NgModule(
 // ...
 imports: [
   // ...
   NgPipesModule
 ]
)

&lt;div *ngFor="let item of items | orderBy: 'id'"&gt;  item  &lt;/div&gt;

【讨论】:

【参考方案2】:

You should not use ordering pipes

Angular 团队和许多经验丰富的 Angular 开发人员强烈建议将过滤和排序逻辑转移到组件中。

如果您想按照name 对您的项目进行排序,就这样吧:

sortBy(prop: string) 
  return this.composer.arrcompositions.sort((a, b) => a[prop] > b[prop] ? 1 : a[prop] === b[prop] ? 0 : -1);

在您的 html 中:

<mat-list-item *ngFor="let composition of sortBy('name')">
   composition[1] 
</mat-list-item>

【讨论】:

感谢 trichetriche 的建议,我将停止使用管道对物品进行分类。我不确定是否可以在我的案例中使用此 filterBy 函数,因为我正在使用我的组合节点中的键和值。 对象中的键和值?因为如果是这样,您的 ngFor 循环将无法工作! 我的 ngFor 工作,因为我用它们创建数组:Object.entries(action.payload.val().compositions); 你想对一个对象的属性进行排序? 是的,我正在尝试使用值(作品的标题)对它们进行排序。我认为结构节点 : [ composition : name, composition : key1:value1, key2, value2, .... ] 是较轻的一个。通过这种方式,尝试使用非规范化方法......

以上是关于使用 *ngFor 数组排序的主要内容,如果未能解决你的问题,请参考以下文章

ngFor - 无法对对象数组进行排序Angular 5

一个无序数组用啥排序方法排序是最快的

二维数组重新排序

PHP 数组排序 +php二维数组排序方法

js如何对下面数组进行排序?

利用Java语言,实现数组的排序