如何使用Backbone.js将过滤后的集合转换为JSON?

时间:2011-10-11 15:42:21

标签: javascript backbone.js

所以我在Backbone中有一个集合来获取事件列表。这个集合有一个方法,它根据传递给它的类别列表过滤列表。

var Events = Backbone.Collection.extend({
    model: Event,
    url: settings.events_url,
    filtered: function(checked) {
        return this.filter(function(e) {
            if ($.inArray(e.get('category').name, checked) >= 0) {
                return true;
            } else {
                return false;
            }
        });
    }
});

我需要做的是将此过滤后的集合转换为JSON,就像整个集合一样。

var events = new Events();
events.toJSON();

但是,由于过滤后的集合不再是实际集合,而是模型列表,因此我没有.toJSON()方法可用。有没有办法将我过滤的集合转换为真正的集合?或者有更简单的方法将其转换为JSON吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

constructor for a collection可以将模型列表作为参数,所以:

var events = new Events();
var filteredEvents = new Events(events.filtered(true));
console.log(filteredEvents.toJSON());

答案 1 :(得分:2)

为什么不使用标准API?

var checked = ['foo', 'bar', 'baz'],
    filtered = eventsCollection
        .chain()
        .filter(function(model) {
            return _.include(checked, model.get('category').name);
        })
        .invoke('toJSON')
        .value();

另外,Events.filterByCategoryName方法名称更明确。但是,我倾向于在我的设计中实现太多“方便”的方法,并直接使用标准API。

答案 2 :(得分:1)

您也可以尝试以下方式:

    filtered: function(checked) {
        return _.map(this.filter(function(e) {
            return $.inArray(e.get('category').name, checked) >= 0
        }), function(model) {
            return model.toJSON();
        });
    }

从内到外:

  1. 对this.filter的调用将返回已经过滤结果的列表。
  2. _.map将对传递的数组的每个条目执行一个操作(它只返回model.toJSON()的结果。)

答案 3 :(得分:0)

你可以这样做:

var myFilteredCollection = new Events(); 

_.each(myFilteredData, function(eventModel){
    myFilteredCollection.add(eventModel); 
});

myFilteredCollection.toJSON(); 

答案 4 :(得分:0)

我解决它的方法是在集合上运行reduce函数。这样做的好处是,您只对集合本身进行1次传递,仅记住有效模型,并在模型通过验证时返回模型的JSON。

其他解决方案提供了建立一个性能明智的新系列 - 可怕。

    getValidItems: function () {
        //return only valid items as json
        return this.collection.reduce(function (validItems, row) {
            if (row.isValid()) {
                validItems.push(row.toJSON());
            }
            return validItems;
        }, []);
    },


    //somewhere where you save
    save: function() {
        var validItems = this.getValidItems();
        //do something with valid items
    }