Javascript 如何从主干集合中提取多个属性?
我试图从主干集合中提取多个属性,但它返回Javascript 如何从主干集合中提取多个属性?,javascript,jquery,html,backbone.js,Javascript,Jquery,Html,Backbone.js,我试图从主干集合中提取多个属性,但它返回未定义的 收藏 { 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
未定义的
收藏
{
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},{}]
有没有其他方法可以获得多个属性?在文档中,它说:
“[弹拨]相当于调用map并返回一个单曲
来自迭代器的属性。“
这让我相信,使用多个属性是不可能的,因为您基本上是用集合中的属性的one替换集合中的one项。所以基本上你是这样做的:
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"]
正如@elclanrs所说,提取单个属性时,必须使用自定义提取函数。差不多
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);
您可以向集合和模型添加select
方法(或者随便你觉得合适的名字) 这将允许您在集合的所有模型中选择多个属性,或在模型上选择多个属性
collection.select('id', 'first', 'last'); // or ['id', 'first', 'last']
model.select('first', 'last'); // or ['first', 'last']
一个JSFIDLE示例会很好。好的,这是一个很好的信息,但是它说“这实际上已经讨论过好几次了,我认为它不适合。”所以您必须找到一个替代解决方案。我用一个解决方案编辑了我的问题,你只需要把它抽象成你自己的小函数。我搞糊涂了!,弹拨可以返回多个属性吗?显然不能。检查相关的问题,你会发现这个
/**
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']