使用 *ngFor 迭代数组,同时过滤某个属性 [重复]

Posted

技术标签:

【中文标题】使用 *ngFor 迭代数组,同时过滤某个属性 [重复]【英文标题】:Using *ngFor to iterate over an array while also filtering on a certain property [duplicate] 【发布时间】:2018-01-08 15:26:57 【问题描述】:

在我的 Angular 2 应用程序中,我想知道是否有一种方法可以迭代数组,同时过滤 *ngFor 块中的某个属性。所以语法看起来像这样:

<ng-template *ngFor="let flag['completed === false'] of service.flags">
    <span class="standard-flag" 
        [class.hold-flag]="flag?.flagType === 'hold'">Flag
    </span>
</ng-template>

所以基本上逻辑是,对于存在的数组中的每个对象(“标志”是一个对象),其中“完成”属性设置为“假”,返回该值。与其先遍历数组,然后使用 *ngIf 进一步过滤,不如在 *ngFor 块中同时执行这两项操作会很好(并且在我的特定情况下非常有帮助)。可能吗?

我之所以对这种构造特别感兴趣,是因为我只想返回“完成”为“假”的值中的第一个,我可以用“让 i = 索引”来处理在这种情况下, *ngFor 块。但我不想返回所有标志对象中的第一个,只返回“完成”属性设置为“假”的标志对象。

【问题讨论】:

您可以实现 PipeTransform 并在 ng-if 中将其用作过滤器angular.io/guide/pipes 如@Jocket 所指出的,在此处使用管道查看此链接以获取类似的实现,此处输入来自用户link。有关管道的更多信息,请查看link 谢谢,这可能很有效。 【参考方案1】:

你可以创建一个custom pipe 来在你循环一个for循环时过滤项目。

import  Pipe, PipeTransform  from '@angular/core';

@Pipe(name: 'notCompleted')
export class notCompletedPipe implements PipeTransform 
  transform(value: string]): string 
    return value != 'completed';
  

并像这样在 html 中使用它,

<ng-template *ngFor="let flag['completed === false'] of service.flags | notCompleted">
    <span class="standard-flag" 
        [class.hold-flag]="flag?.flagType === 'hold'">Flag
    </span>
</ng-template>

【讨论】:

【参考方案2】:

使用管道进行过滤不是一个好主意。请参阅此处的链接:https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe

相反,在您的组件中添加代码来执行您的过滤。然后在过滤后的数据上使用您的 ngFor。

下面是一个例子。然后,在本例中,您将只使用 ngFor 而非过滤的产品。

import  Component, OnInit  from '@angular/core';

import  IProduct  from './product';
import  ProductService  from './product.service';

@Component(
    templateUrl: './product-list.component.html'
)
export class ProductListComponent implements OnInit 

    _listFilter: string;
    get listFilter(): string 
        return this._listFilter;
    
    set listFilter(value: string) 
        this._listFilter = value;
        this.filteredProducts = this.listFilter ? this.performFilter(this.listFilter) : this.products;
    

    filteredProducts: IProduct[];
    products: IProduct[] = [];

    constructor(private _productService: ProductService) 

    

    performFilter(filterBy: string): IProduct[] 
        filterBy = filterBy.toLocaleLowerCase();
        return this.products.filter((product: IProduct) =>
              product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1);
    

    ngOnInit(): void 
        this._productService.getProducts()
                .subscribe(products => 
                    this.products = products;
                    this.filteredProducts = this.products;
                ,
                    error => this.errorMessage = <any>error);
    

【讨论】:

以上是关于使用 *ngFor 迭代数组,同时过滤某个属性 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 *ngFor 迭代对象键

如何根据对象属性字符串过滤“ngFor”循环内的项目

Angular - 如何将 ngFor 过滤到特定的对象属性数据

自动列出当前 Object 数据迭代的每个属性值的动态表组件(ngFor 指令);

Swift:获取由某个属性过滤的对象数组的索引

PHP 过滤对象数组并返回新的对象数组,同时基于一个属性删除重复项