2013-06-15 17 views
9

Omurga koleksiyonundan birden çok özniteliği kopyalıyorum ama undefined döndürür.Omurga koleksiyonundan birden fazla özniteliği nasıl kopyalayabilirsiniz?

ben koleksiyonundan birden özelliklerini almaya çalışıyorum

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

... //many models 

koleksiyonu.

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

Beklenen çıkış

[{//multiple attributes},{}] 

birden özelliklerini almak için herhangi bir alternatif yol var?

+0

Bir jsFiddle örneği hoş olurdu. – elclanrs

cevap

17

@elclanrs belirttiğimiz gibi collection.pluck tek niteliği ayıklar , özel bir çıkarma fonksiyonu ile _.map kullanmanız gerekecektir. Sen Collection.invoke ve 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/


birleştirerek bu aramayı kolaylaştırmak olabilir 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); 

Ve bir demo gibi bir şey senin çıkarma işlevi modellerinin prototip üzerinde tanımlanması durumunda, benzer bir ruhla

:

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

docs şöyle der:

"harita arama ve Yineleyici bir tek niteliğini dönen eşdeğerdir [koparmak dir]."

Bu temelde onun özelliklerinin biri ile koleksiyonunda bir öğeyi değiştiriyorsanız çünkü birden çok mülkü olan mümkün olmadığını beni inandıramaz. Yani temelde bunu yaptığını:

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

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

Muhtemel bir çözüm bunu bir dizi döndürür ve sonra dümdüz olurdu şey böyle:

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

'a bir bakalım, bu iyi bir bilgi ancak diyor ki "Bu aslında daha önce birkaç kez tartışıldı ve bunun iyi olduğunu sanmıyorum "_ Yani alternatif bir çözüm bulmanız gerekiyor. Sorumu bir çözümle düzenledim, sadece kendi küçük işlevinize eklemeniz gerekiyor. – elclanrs

+0

Kafam karıştı !, birden fazla özniteliğe sahip olabilir misiniz? –

0

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

Sen koleksiyonları ve modellerine select yöntemleri ekleyebilir.
(veya uygun olduğunu hissediyorum ne olursa olsun bunun adı)

/** 
    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); 
    }); 
} 

Bu, bir koleksiyonun tüm modeller arasında birden fazla mülkü seçin veya bir model üzerinde birden özelliklerini seçmek için izin verecek.

collection.select('id', 'first', 'last'); // or ['id', 'first', 'last'] 
model.select('first', 'last');    // or ['first', 'last'] 
İlgili konular