2013-06-15 3 views
9

バックボーンコレクションから複数の属性を抜き取ろうとしていますが、undefinedを返します。私はコレクションから複数の属性を取得しようとしていますBackboneコレクションから複数の属性を抜き出す方法は?

コレクション

{ 
    id:1, 
    name:"raju", 
    age:23, 
    sex:male, 
    hobbies:.. 
} 
{ 
    id:2, 
    name:"ramesh", 
    age:43, 
    sex:male, 
    hobbies:.. 
} 

... //many models 

collection.pluck(["id","name","age","sex"]); 

の予想される出力

[{//multiple attributes},{}] 

複数の属性を取得する任意の代替方法はありますか?ドキュメントで

+0

jsFiddleの例は素晴らしいでしょう。 – elclanrs

答えて

17

var collect = [{a:'foo',b:'baz'},{a:'lol',b:'fur'}]; 

var key = 'a'; 
var result = collect.map(function(o){ return o[key] }); 

を可能な解決策は、配列を返すと、それを平らに、このような何かすることですカスタム抽出機能を使用して_.mapを使用する必要があります。あなたがCollection.invokeModel.pick

var c = new Backbone.Collection([ 
    {id: 1, name: "raju", age: 23, sex: "male"}, 
    {id: 2, name: "ramesh", age: 43, sex: "male"} 
]); 

plucked = c.invoke("pick", ["name", "age"]); 
console.log(plucked); 

http://jsfiddle.net/U7p9u/5/


を組み合わせることにより、この呼び出しを簡素化することができ http://jsfiddle.net/U7p9u/


var c = new Backbone.Collection([ 
    {id: 1, name: "raju", age: 23, sex: "male"}, 
    {id: 2, name: "ramesh", age: 43, sex: "male"} 
]); 

var plucked = c.map(function (model) { 
    return _.pick(model.toJSON(), ["name", "age"]); 
}); 
console.log(plucked); 

とデモのようなもの同様の精神で

、あなたの抽出機能は、お使いのモデルのプロトタイプに定義されている場合:

var M = Backbone.Model.extend({ 
    mypluck: function() { 
     return this.pick("name", "age"); 
    } 
}); 

var C = Backbone.Collection.extend({ 
    model: M 
}); 

var c = new C([ 
    {id: 1, name: "raju", age: 23, sex: "male"}, 
    {id: 2, name: "ramesh", age: 43, sex: "male"} 
]); 

var plucked = c.invoke("mypluck"); 
console.log(plucked); 

http://jsfiddle.net/U7p9u/3/

3

それは言う:

「マップを呼び出すとイテレータから単一 の属性を返すことに相当[Pluckのがあります]。」

これは、基本的には、そのプロパティのでコレクションにのアイテムを交換しているので、それが複数のプロパティでは不可能であると信じて私をリードしています。だから、基本的には、このやっている:@elclanrsは、単一の属性を抽出しcollection.pluck、言ったように

result = [].concat.apply([],collect.map(function(o){ return [o.a,o.b]; })); 

console.log(result); //=> ["foo", "baz", "lol", "fur"] 
+0

これを見てくださいhttps://github.com/documentcloud/underscore/pull/1116 –

+0

それは良い情報ですが、それは言う_これは実際に数回前に議論されていると私はそれが良いとは思わないフィット "。_別の解決策を見つける必要があります。私は解決策で私の質問を編集しただけで、あなた自身の小さな機能に抽象化する必要があります。 – elclanrs

+0

私は混乱しています!、複数の属性を返すことができますか? –

0

http://jsfiddle.net/CoryDanielson/Lj3r85ew/

あなたは、コレクションやモデルにselectメソッドを追加することができます。
(またはあなたが適切であると感じ何という名前を付けます)

/** 
    Backbone Model Select/Multi-get ------------------------------------------- 
*/ 

Backbone.Model.prototype.select = function(props) { 
    if (arguments.length > 1) { 
     props = slice.call(arguments); 
    } 
    if (_.isArray(arguments[0])) { 
     props = arguments[0]; 
    } 

    // If requesting multiple, return all props 
    if (_.isArray(props)) { 
     return _.object(props, _.map(props, _.bind(this.get, this))); 
    } 
    // Else, return single property 
    return this.get(props); 
} 

/** 
    Backbone Collection Select ------------------------------------------------ 
*/ 
Backbone.Collection.prototype.select = function(props) { 
    if (arguments.length > 1) { 
     props = slice.call(arguments); 
    } 
    if (_.isArray(arguments[0])) { 
     props = arguments[0]; 
    } 

    return _.map(this.models, function(m) { 
     return m.select(props); 
    }); 
} 

これは、コレクションのすべてのモデル間で複数のプロパティを選択することができ、またはモデル上の複数のプロパティを選択することになります。

collection.select('id', 'first', 'last'); // or ['id', 'first', 'last'] 
model.select('first', 'last');    // or ['first', 'last'] 
関連する問題