web-dev-qa-db-fra.com

Filtrer la collection de dorsale par valeur d'attribut

J'ai un modèle défini et une collection:

var Box = Backbone.Model.extend({
    defaults: {
        x: 0,
        y: 0,
        w: 1,
        h: 1,
        color: "black"
    }

});

var Boxes = Backbone.Collection.extend({
    model: Box
});

Lorsque la collection est remplie de modèles, j'ai besoin d'une nouvelle collection Boxes faite de modèles Box qui ont un attribut de couleur spécifique contenu dans la collection complète, je le fais de cette façon:

var sorted = boxes.groupBy(function(box) {
    return box.get("color");
});


var red_boxes = _.first(_.values(_.pick(sorted, "red")));

var red_collection = new Boxes;

red_boxes.each(function(box){
    red_collection.add(box);
});

console.log(red_collection);

Cela fonctionne, mais je le trouve un peu compliqué et inefficace. Existe-t-il un moyen de faire cette même chose de manière plus simple?

Voici le code que j'ai décrit: http://jsfiddle.net/HB88W/1/

42
rpabon

J'aime retourner une nouvelle instance de la collection. Cela rend ces méthodes de filtrage chaînables (boxes.byColor("red").bySize("L"), par exemple).

var Boxes = Backbone.Collection.extend({
    model: Box,

    byColor: function (color) {
        filtered = this.filter(function (box) {
            return box.get("color") === color;
        });
        return new Boxes(filtered);
    }
});

var red_boxes = boxes.byColor("red")
83
hgmnz

Voir http://backbonejs.org/#Collection-where

var red_boxes = boxes.where({color: "red"});

var red_collection = new Boxes(red_boxes);
45
Andrei