arrays - 数组内的角度过滤器数组
问题描述
我正在使用 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>
使用管道过滤而不修改原始数组的最佳(简单和优化)方法是什么?
解决方案
在管道实现下方使用默认键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
}
}
推荐阅读
- php - 渲染一个没有缓存的 Twig 模板
- visual-studio-2017 - VS 15.8.2 破坏了构建工具 - 缺少 RuntimeIdentifier
- android - 在 BillingProcessor.purchase 后应用计费不显示弹出消息
- vb6 - 为什么在 sub vb6 上传递参数时我检索错误?
- laravel - 使用 JSON.stringify 传递单个数据时进行验证
- mysql - 将 SUM 添加到 SQL 查询使其持续 7 分钟而不是 3 秒
- python - 如何在 Keras Python 中使用 TF IDF 矢量化器和 LSTM
- java - 如何使用spring data jpa调用数据库函数?
- react-apollo - 阿波罗升压默认状态
- html - HTML表格宽度问题