dojo 根据数组字段过滤数据存储集合

balp4ylt  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(146)

我试图通过一个包含数组值的字段来过滤一个dstore集合。我的json数据看起来如下所示(简化):

[{
    user_id: 1,
    user_name: "John Doe",
    teams: [{team_id: 100, team_name: 'Red Sox'}, {team_id: 101, team_name: 'Buccaneers'}]
},
{
    user_id: 2,
    user_name: "Fred Smith",
    teams: [{team_id: 100, team_name: 'Buccaneers'}, {team_id: 102, team_name: 'Rays'}]
}]

我可以做一个简单的过滤器对用户名字段和它的工作完美。

this.dstoreFilter = new this.dstore.Filter();

var results = this.dgrid.set('collection', this.dstore.filter(
     this.dstoreFilter.match('user_name',new RegExp(searchTerm, 'i'))
));

然而,我如何构造一个过滤器来只显示那些为红袜队效力的球员呢?我试过使用filter.contains()方法,但是我找不到任何关于它如何工作的足够的文档。查看数据存储代码,我发现filter.contains()方法具有以下签名:(value、required、object、key),但这对我没有多大帮助。
任何指导将不胜感激。提前感谢!

knsnq2tg

knsnq2tg1#

您可以在此处找到有关过滤的文档。
在您的示例中,.contains()将不起作用,因为它旨在处理数组类型的值。这里您要过滤的是对象数组。下面是来自文档链接的引用:
contains:过滤指定属性值为数组且数组包含等于提供的值或满足提供的表达式的任何值的对象。
在我看来,这里最好的方法是在你想按团队名称过滤的地方覆盖filter方法。下面是一些示例代码:

this.grid.set('collection', this.dstore.filter(lang.hitch(this, function (item) {
    var displayUser = false;
    for(var i=0; i < item.teams.length; i++){
        var team = item.teams[i];
        if(team.team_name == 'Red Sox'){
            displayUser = true;
            break;
        }
    }
    return displayUser;
})));
this.grid.refresh();

对于存储中的每个用户,如果返回false,则display设置为false,如果返回true,则display显示,这是迄今为止我所知道的对dstore应用复杂过滤的最简单方法。
下面是一些类似的问题,您可能需要仔细阅读:linklinklink

相关问题