【问题标题】:Filtering an Array of Nested Objects Using Angular Pipes使用角度管道过滤嵌套对象数组
【发布时间】:2021-01-27 18:32:37
【问题描述】:

我正在尝试过滤嵌套数组值以及对象名称,当我搜索年龄、体重、身高和移动设备等数字值时没有得到任何东西。如果与 searchText 匹配,则必须返回特定值以及对象,否则返回完整数组而不是未找到消息。

管道.ts

import { Pipe, PipeTransform } from '@angular/core';
    
    @Pipe({
        name: 'FilterPipe',
    })
    export class FilterPipe implements PipeTransform {
    
        transform(items: any, filter: any, defaultFilter: boolean): any {
            if (!filter || !Array.isArray(items)) {
                return items;
            }
    
            if (filter && Array.isArray(items)) {
                let filterKeys = Object.keys(filter);
    
                if (defaultFilter) {
                    return items.filter(item =>
                        filterKeys.reduce((x, keyName) =>
                            (x && new RegExp(filter[keyName], 'gi').test(item[keyName])) || filter[keyName] == "", true));
                }
                else {
                    return items.filter(item => {
                        return filterKeys.some((keyName) => {
                            return new RegExp(filter[keyName], 'gi').test(item[keyName]) || filter[keyName] == "";
                        });
                    });
                }
            }
        }
    }

app.ts

import { Component } from '@angular/core';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {
    title = 'testJobNestedArray';
    searchableList: any;
    searchText : string = "";
    users : any;

    constructor() { }

    ngOnInit() {

        this.users = [
            {
                name: 'manpreet',
                data:{
                        age: 25,
                        weight: 65,
                        height: 5.6,
                        mobile: [9780698969, 6895741258]
                    }   
            },
            {
                name: 'abdul',
                data: {
                        age: 26,
                        weight: 80,
                        height: 6.0,
                        mobile: [3698541258]
                    }
            },
            {
                name: 'onkar',
                data: {
                        age: 28,
                        weight: 70,
                        height: 5.8,
                        mobile: [8569741236, 6528965478]
                    }
            }
        ]
        // this.searchableList = ['name', 'age', 'weight', 'height', 'mobile']
        console.log('this.users', this.users)
    }
}

app.html

<router-outlet></router-outlet>
<div>
    <h1>Nested Array Table</h1>
    <div class="md-form">
        <input type="text" [(ngModel)]="searchText" class="form-control" name="searchText" placeholder="Search" />
    </div>
    <table class="table table-bordered">
        <thead>
            <tr>
                <th>#ID</th>
                <th>Name</th>
                <th>Age</th>
                <th>Weight</th>
                <th>Height</th>
                <th>Mobile</th> 
            </tr>
        </thead>
        <tbody>
            <tr
                *ngFor="let item of users| FilterPipe: 
                {name: searchText, age: searchText, weight: searchText, height: searchText, mobile: searchText}; let i = index">
                <td>{{ i+1 }}</td>
                <td>{{ item.name }}</td>
                <th>{{ item.data.age }}</th>
                <td>{{ item.data.weight }}</td>
                <td>{{ item.data.height}}</td>
                <td>{{ item.data.mobile }}</td>
            </tr>
        </tbody>
    </table>
</div>

【问题讨论】:

    标签: javascript arrays angular pipes-filters


    【解决方案1】:

    在 FilterPipe 类中,请将 else 语句更改如下

     return items.filter(item => {
                        return filterKeys.some((keyName) => {
                            return new RegExp(filter[keyName], 'gi').test(item[keyName]) || 
                            new RegExp(filter[keyName], 'gi').test(item.data[keyName]) ||
                            filter[keyName] == "";
                        });
                    });
    

    问题是缺少数据对象下的属性。请参阅以下链接中的工作代码

    stackblitz

    【讨论】:

    • 太棒了。如果有帮助,您能否接受答案。谢谢
    • 因为我是新来的不确定。你能给我同样的想法吗?
    • ok..在我回答的左边,会有勾号。请点击那个。
    • 请参考这个链接meta.stackexchange.com/questions/5234/…谢谢
    • 如果你能帮助我,我正在同一张桌子上做额外的工作。我正在为每一列添加单独的列搜索,即按 id 搜索、按名称搜索、按年龄搜索等等。
    猜你喜欢
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多