从Backbone集合中检索特定属性的列表

时间:2013-05-14 14:34:38

标签: javascript json backbone.js underscore.js

我正在寻找一种方法,从骨干集合中检索某种特定属性的某种数组。

var SomeModel = Backbone.Model.extend({
    defaults: function() {
        return {
            attr1: "something",
            attr2: "something",
            attr3: "darkside"
        };
    }
});

var SomeCollection = Backbone.Collection.extend({
    model: SomeModel,
    url: '/data.json',
});

现在假设我有类似上面的东西,我只想要一个只有属性' attr3'的集合/数组/类似物。有没有很好的方法来获得这个(不是通过手动迭代SomeCollection和构建一个新的集合)?我对下划线功能的理解"过滤"是它根据某个前提返回整个SomeModel,即这不是我想要的。想法?

谢谢

4 个答案:

答案 0 :(得分:4)

如果您只想要一个属性,则可以使用_.pluck

SomeCollection.pluck('attr3');

对于多个属性,您可以在集合上合并_.map,在模型上合并_.pick

SomeCollection.map(function (model) {
    return model.pick('attr2', 'attr3');
});

演示http://jsfiddle.net/nikoshr/qpyXc/1/

或者,对于使用_.invoke

的更简洁版本
SomeCollection.invoke('pick', 'attr2', 'attr3');

http://jsfiddle.net/nikoshr/qpyXc/3/

答案 1 :(得分:1)

我想你想要Underscore的pluck

  

可能是最常见的用例的便捷版本   map:提取属性值列表。

var attrs = _.pluck(someCollection.models, 'attr3');

答案 2 :(得分:1)

我认为这里存在一些误解。在您发布的代码中,您为新创建的模型设置了默认属性。通过以下方式创建的任何模型:

var model = new SomeModel({});

或:

var collection = new SomeCollection();
// Add to collection
collection.add({});
// Add to collection AND sync with server
collection.create({});

将这些属性设置为给定值,因为您没有在传递给上述函数的哈希中对它们进行不同的定义。

相反,我认为你要求这个:

// Create some models
var model_a = new SomeModel({attr1: "Alpha"});
var model_b = new SomeModel({attr1: "Beta"});
var model_c = new SomeModel({attr1: "Gamma"});

// Push them in the collection
var collection = new SomeCollection([model_a, model_b, model_c]);

然后,您可以获得包含所请求模型属性值的字符串数组:

collection.pluck(attributeName);

这本身就是一个继承自Underscore.js的函数,Backbone依赖它。

我指定这一点以明确_.pluck(array,attributeName)也可用于外部 Backbone上下文并适用于数组,而不是集合。在内部,collection.pluck调用_.pluck(collection.models,fieldName)。

答案 3 :(得分:0)

someCollection.pluck.call({
    models: someCollection.where({
        attribute_name:attribute_value
    })
}, attribute_val_to_fetch);