@Lomiren
Web-программист

Как сделать проверку на вхождение в массив?

Здравствуйте, пытаюсь эксперементировать с backbone js.


Хотел сделать простенький фильтр колекций

var mClub = new Cafe([
    {id: 1, name: "name 1", kitchens: [1,2], show: 1},
    {id: 2, name: "name 2", kitchens: [1,3], show: 1},
    {id: 3, name: "name 3", kitchens: [2], show: 1},
    {id: 4, name: "name 4", kitchens: [1], show: 1},
    {id: 5, name: "name 5", kitchens: [3], show: 1},
]);

var filters = new Filter([
    {id: 1, kitchens: new Array()}
]);



фильтр «kitchens» заполняется по мере выбора соответствующих параметров


Теперь задача — отсортировать колекцию mClub если хоть один параметр из filters встречается в kitchens — то оставить show 1 если нет то 0


Думал для этого должен подойти подход с indexOf — в итоге вот такой код
var Cafe = Backbone.Collection.extend({
    model: CafeModel,

    check : function(filter) {
        var show = true;
        var a = filter.get('kitchens');
        this.filter(function(cafe) {
            var b = cafe.get('kitchens');

            // Попытка с indexOf - не работает
            // если задать а и b ручками - то работает
            // var a = [1,3]; var b = [3,2]
            for (var i = 0; i < b.length; i++){
                if(_.indexOf(a, b[i])){
                    //alert('есть вхождение')
                }
            }
           //через фильтр - работает
            b.filter(function(c){
                for (var i = 0; i < a.length; i++){
                    if( a[i] == c){
                        //alert('есть вхождение')
                    }
                }
            });
        });
    }
});



Возможно я чего то не так делаю и может кто подскажет способ получше, с последствии фильтр будет дополняться другими параметрами.
  • Вопрос задан
  • 5381 просмотр
Пригласить эксперта
Ответы на вопрос 5
wwwsevolod
@wwwsevolod
оператор in
Ответ написан
Комментировать
vermilion1
@vermilion1
Я бы сделал так:

var filter = new Filter();
filter.add([
    {id: 1, kitchens: new Array()},
    {id: 2, kitchens: [2]},
    {id: 3, kitchens: [2, 3]},
    {id: 4, kitchens: []}
])

Filter = Backbone.Collection.extend({
    initialize : function() {
        this.on('add', this.check);
    },
    check : function(model) {
        model.set('show', model.get('kitchens').length ? 1 : 0);
    }
});

Еще можно использовать метод validate для модели, но по-моему у него немного другое назначение
Ответ написан
@Lomiren Автор вопроса
Web-программист
А еще интересен момент как бы сделать цепочку фильтров, сейчас я все проверки загнал в одну фукцию cheсk
Ответ написан
Комментировать
kuzemchik
@kuzemchik
Это все может underscore (как преквезит backbone), либо через filter, либо через include. Для цепочки .chain().… .value()
Ответ написан
@personaljs
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы