数组内的角度过滤器数组

Posted

技术标签:

【中文标题】数组内的角度过滤器数组【英文标题】:Angular filter array inside array 【发布时间】:2021-04-01 13:42:50 【问题描述】:

我正在使用 Angular 9 应用程序,我需要根据每个对象内的另一个数组过滤一个数组。为了理解我这里是一个数组的例子

const products = [
  
      name: 'Product 1',
      origins: [
           quantity: 1, name: 'Pack 1' ,
           quantity: 1, name: 'Pack 2' ,
      ]
  ,
  
      name: 'Product 2',
      origins: [
           quantity: 1, name: 'Pack 1' ,
           quantity: 1, name: 'Pack 2' ,
      ]
  ,
  
     name: 'Product 3',
     origins: [
           quantity: 1, name: 'Inventory' ,
           quantity: 1, name: 'Pack 5' ,
     ]
  
]

所以我得到了一个过滤器输入,它必须通过产品名称或一个或多个原产地名称的巧合来过滤产品。

例如,如果我输入“2”,结果数组必须是:

products = [
  
      name: 'Product 1',
      origins: [
           quantity: 1, name: 'Pack 2' ,
      ]
  ,
  
      name: 'Product 2',
      origins: [
           quantity: 1, name: 'Pack 2' ,
      ]
  
]

因为字符“2”出现在产品 1 和产品 2 的原产地名称中,也出现在名称“产品 2”中 我尝试了很多方法来做到这一点,但是当我将它放入管道时,结果数组总是会修改我的原始数组

<input type="text" [(ngModel)]="searchtext">
<div *ngFor="let p of (saleProducts | filter : searchtext); let i = index">
     p.name 
    <div *ngIf="p.origins.length > 0">
        <div *ngFor="let o of p.origins">
             o.name 
        </div>
    </div>
</div>

在不修改原始数组的情况下使用管道进行过滤的最佳(简单和优化)方法是什么?

【问题讨论】:

【参考方案1】:

在管道实现下使用默认键origins

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

@Pipe(
  name: 'filter'
)
export class FilterPipe implements PipeTransform 

  transform(value: any[], searchName: string, key = 'origins'): any[] 
    const products = []
    value.forEach(product => 
      const matches = product[key].filter(( name ) => name === searchName)
      if (matches.length) 
        products.push( ...product, [key]: matches )
       
    )
  
    return products
  

【讨论】:

以上是关于数组内的角度过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章

如何正确过滤角度数组

如何使用带角度的复选框过滤对象数组?

如何让 vuejs 过滤器为数组内的嵌套项工作?

如何从数组中过滤数据并使用角度js应用无限滚动?

如何在javascript中过滤数组内的嵌套对象

Javascript过滤对象内的数组