2013-06-15 5 views
9

मैं बैकबोन संग्रह से कई विशेषताओं को खींचने की कोशिश कर रहा हूं लेकिन यह undefined देता है।बैकबोन संग्रह से एकाधिक विशेषताओं को कैसे फंसाना है?

संग्रह

{ 
    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

एक जेएसफ़िल्ड उदाहरण अच्छा होगा। – elclanrs

उत्तर

17

रूप @elclanrs कहा, collection.pluck एक भी विशेषता निकालता है , आपको एक कस्टम निष्कर्षण समारोह के साथ _.map का उपयोग करना होगा। जैसे

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); 

और एक डेमो कुछ http://jsfiddle.net/U7p9u/


आप Collection.invoke और Model.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/


संयोजन से इस कॉल को आसान बनाने में कर सकता है

एक ऐसी ही भावना में, अगर आपके निकासी समारोह अपने मॉडल के प्रोटोटाइप पर परिभाषित किया गया है:

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

डॉक्स में यह कहते हैं:

"नक्शा बुला और पुनरावर्तक से एक एकल विशेषता लौटने के बराबर [प्लक है]।"

इस ओर जाता है मुझे विश्वास है कि यह कई गुणों के साथ संभव नहीं है क्योंकि आप मूल रूप से इसके गुणों के एक साथ संग्रह में एक आइटम बदल रहे हैं। कुछ इस तरह

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

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

सम्भावित समाधान एक सरणी लौटने और फिर समतल इसे करने के लिए हो सकता है,:: तो बुनियादी तौर पर आप इस कार्य कर रहे हैं

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'] 
संबंधित मुद्दे