Фильтровать магистральную коллекцию по нескольким атрибутам модели

#javascript #backbone.js #filter

#javascript #backbone.js #Фильтр

Вопрос:

У меня небольшая проблема с тем, как наилучшим образом фильтровать магистральную коллекцию по ее атрибутам моделей. Моя настройка такая:

У меня есть коллекция с несколькими моделями в ней. Каждая модель имеет атрибут, который содержит массив чисел («тип»). Вот так:

 - Collection
- model
    - id: 1
    - name
    - phone
    - type [3]
- model
    - id: 2
    - name
    - phone
    - type [2]
- model
    - id: 3
    - name
    - phone
    - type [1,2]
  

Что я хочу здесь сделать, так это иметь возможность фильтровать эти коллекции по атрибуту «тип» модели.

У меня есть этот атрибут «type», потому что это для списка контактов, и каждый контакт может быть нескольких типов. Например. коллекция должна быть способна фильтроваться по неограниченным типам. Вы должны иметь возможность фильтровать, скажем, по типу «1» и типу «2», которые затем будут показывать модель 2 и модель 3. Причина в том, что модель 1 не имеет «типа» 1.

Любые хорошие примеры кода или другая помощь по этому вопросу были бы замечательными. Спасибо!

Ответ №1:

Вы можете использовать следующий код

 var filColl=myColl.filter(function(o){return _.indexOf(o.get('type'), 1) >-1 })
  

Вот ссылка jsFiddle рабочего кода с некоторыми примерами данных.

Комментарии:

1. Привет! Спасибо, это отлично работает для типа 1. Но мне было интересно, как я мог бы сделать это немного более динамичным? Например, иногда тип может быть как 1, так и 2. Эта фильтрация выполняется по событию щелчка. Итак, я думал о том, чтобы просто поместить тип в качестве объекта данных в массив по щелчку мыши. А затем фильтровать ее в зависимости от того, какие типы в данный момент содержит этот массив. (сопоставление его с коллекцией)

Ответ №2:

Привет, вот код, который может фильтровать по нескольким типам, хранящимся в массиве

 var typesTofilter=[5,1,2];//array of type tobe search.
    var f2=friends.filter(function(o){ var accept=false;                                    
                                       $(typesTofilter).each(function(i,val){
                                         if(_.indexOf(o.get('type'), val) >-1){
                                           accept= true;                      
                                            }
                                        })
                                        return accept; 
                         });
  

И вот jsFiddle .

Комментарии:

1. Спасибо, чувак! Worsk отлично. Если я теперь хочу сбросить мою текущую отображаемую коллекцию с соответствующим результатом?

2. Неважно. разберитесь с этим. Это было действительно просто, просто использовал collection.reset() и передал новый результат. Также была коллекция для прослушивания события изменения.