gpt4 book ai didi

typescript - 如何使用 Angular 2 管道对对象列表进行排序

转载 作者:太空狗 更新时间:2023-10-29 17:33:18 24 4
gpt4 key购买 nike

我正在尝试创建一个管道来对自定义类型的数组进行排序。

// custom-object.ts
export class CustomObject {
constructor(
public someString: string,
public someNumber: number
) {}
}

在我的 html 中是:

// custom-object-form.component.ts
<div class="form-group">
<label for="cricos_course_code">Object: </label>
<select class="form-control" required [(ngModel)]="model.someString">
<option *ngFor="#object of (customObjects | sortArrayOfCustomObjects)" [value]="object.someString">{{object.someString}}</option>
</select>
</div>

然后是管道的代码:

// sort-custom-object.pipe.ts
import {Pipe, PipeTransform} from 'angular2/core';
import {CustomObject} from '../custom-object';

@Pipe({name: 'sortArrayOfCustomObjects'})
export class SortArrayOfCustomObjectsPipe implements PipeTransform {
transform(arr:Array<CustomObject>): any {
return arr.sort((a, b) => {
if (a.someString > b.someString) {
return 1;
}
if (a.someString < b.someString) {
return -1;
}
// a must be equal to b
return 0;
});
}
}

现在我在控制台中收到一个错误:

EXCEPTION: TypeError: Cannot read property 'sort' of undefined in [(customObjects | sortArrayOfCustomObjects) in FormComponent@7:24]

最佳答案

根据您的有限信息,我相信您需要以下内容。

@Pipe({name: 'sortArrayOfCustomObjects'})
export class SortArrayOfCustomObjectsPipe implements PipeTransform {

transform(arr: CustomObject[], args: any): CustomObject[]{
return arr.sort((a, b) => {
if (a.p1 > b.p1 || a.p2 < b.p2) {
return 1;
}
if (a.p1 < b.p1 || a.p2 > b.p2) {
return -1;
}
return 0;
});
}
}

这将首先按 p1 对对象进行排序,然后按 p2 对对象进行排序。例如。

{p1: 'AA', p2: 3},
{p1: 'CC', p2: 2},
{p1: 'BB', p2: 5},
{p1: 'BB', p2: 1},
{p1: 'AA', p2: 2},
{p1: 'DD', p2: 4}

将被排序为

{p1: 'AA', p2: 3},
{p1: 'AA', p2: 2},
{p1: 'BB', p2: 5},
{p1: 'BB', p2: 1},
{p1: 'CC', p2: 2},
{p1: 'DD', p2: 4}

这是基于您的评论:

I have an array of objects that contain properties p1: string, p2: number etc. In my form I want to have 2 select fields that show a list of p1 in alphabetical order and p2 in descending order.

用法是

*ngFor="#item of (items | sortArrayOfCustomObjects)"

更新

对于您现在收到的错误,请务必使用守卫来防止数组中出现 undefined 值。

transform(arr: CustomObject[], args: any): CustomObject[]{
if(!arr){ return; }
...
}

关于typescript - 如何使用 Angular 2 管道对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35167061/

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