Фильтрация коллекции dstore по полю массива

Я пытаюсь отфильтровать коллекцию 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'))
));

Как, однако, я могу построить фильтр, чтобы показать мне только тех игроков, которые играют за Red Sox, например. Я пытался использовать метод filter.contains(), но я не могу найти адекватную документацию о том, как он работает. Глядя на код dstore, я вижу, что метод filter.contains() имеет следующую подпись: (значение, обязательный, объект, ключ), но это мне мало помогает.

Любое руководство будет высоко ценится. Заранее спасибо!

1 ответ

Решение

Вы можете найти документацию по фильтрации здесь.

В твоем случае, .contains() не будет работать, потому что он предназначен для работы со значениями типа массива. Здесь вы хотите отфильтровать массив объектов. Вот цитата из ссылки на документацию:

содержит: Фильтры для объектов, в которых значением указанного свойства является массив, а массив содержит любое значение, равное предоставленному значению или удовлетворяющее предоставленному выражению.

На мой взгляд, лучший способ здесь - переопределить метод фильтра, в котором вы хотите фильтровать по имени команды. Вот пример кода:

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 возвращается, его дисплей установлен в ложь, и если true возвращается это отображается На сегодняшний день это самый простой способ применить сложную фильтрацию dstore,

Некоторые похожие вопросы, которые вы можете прочитать: ссылка, ссылка, ссылка

Другие вопросы по тегам