用子数组过滤数组

Filter array with subarray

我在创建搜索过滤器时遇到问题,我在模块中使用 * ngFor,名称通常如下所示:

(game.name.toLowerCase().includes(typed))

但是数组中的平台只有在我放置索引时才有效:

(game.platform[i].toLowerCase().includes(typed))

但是这个平台是动态的,我不能在过滤器中使用 for 或类似的东西

Json

[
    {
        "name":"GTA",
        "platform":[
            "xbox",
            "playstation"
        ]
    }
]

组件

<tr *ngFor="let game of (games | searchGame:SearchedText.value)">
    <td>{{game.name}}</td>
    <td>{{game.category}}</td>
    <td>{{game.platform | separator}}</td> 
    // "platform":["Playstation 4","Xbox One"]
    <td>{{game.price | currency}}</td>
    <td>{{game.quantity}}</td>
    <td>{{game.production ? 'Sim' : 'Não'}}</td>
    <td>{{game.description}}</td>
    <td><i class="fa fa-pencil icon" aria-hidden="true" (click)="staticModal.show()"></i></td>
    <td><i class="fa fa-times icon" aria-hidden="true" (click)="staticModal.show()"></i></td>
</tr>

管道

transform(game, typed){

    typed = typed.toLowerCase();

    return game.filter( game =>

        (game.name.toLowerCase().includes(typed)) ||

        (game.category.toLowerCase().includes(typed)) ||

        (game.platform.toLowerCase().includes(typed)) || // Error in this line

        (game.price.toLowerCase().includes(typed)) ||

        (game.quantity.toLowerCase().includes(typed)) ||

        (game.production.toLowerCase().includes(typed)) ||

        (game.description.toLowerCase().includes(typed))

    );


}

如果我对你的问题的理解正确,那么你的过滤器没有达到你的要求。

第一个管道参数应该是一个数组。我认为 'any' 有效,但 'any[]' 更干净:-)

您正在做:

tranform(game: any,...)

试试这个:

transform(game: any[], typed: string){

....

return game.filter(game => game.name.toLowerCase().indexOf(typed) > -1 ||
....

此外,在开始时,您的搜索标记(键入的)可能为 null 或为空。 为此,您应该将以下内容添加到 return 未过滤的数组。否则你将不会在你的 *ngFor 中看到任何东西。

if (typed == null || typed == "")
    return game;

希望对您有所帮助。

编辑:将错误行替换为

game.filter(game => game.platforms.some(el => el.toLocaleLowerCase().includes(typed)))