2013-05-10 26 views
1

我有一个Backbone集合,我正在遍历并查找mdl.get('group')。这将返回:在Backbone集合中分组类似的模型

[undefined, undefined, group, group, group, undefined, group, group, group, undefined, group, group]

我想该怎么回报这些组模型的阵列(或集合):

[undefined, undefined, [group], undefined, [group], undefined, [group]

我试图想的最佳方式:

  • 迭代通过对象
  • 返回 '未定义'在不改变其值
  • 找到兄弟姐妹有类似值的
  • 塌陷他们到一个数组,对象

很像_.groupBy方法中,但我需要保留模型的正确顺序内物体。

我很想谈谈如何解决这个问题。到目前为止,我正在绊倒如何正确解决这个问题。

谢谢!

+0

一个澄清:除了一般常规,如果他们有相同的,给定的属性同类机型中得到分组? – sixFingers 2013-05-10 23:57:40

+0

听起来不错,类似的模型按给定的属性分组。如果兄弟姐妹由于没有这个属性而分开(未定义),那么我们继续下一组模型。 – gleddy 2013-05-11 00:04:14

回答

1

经过一番修补之后,想出了这个解决方案。我扩展Array.prototype,让你可以轻松地删除它可以使一个下划线扩展或Collection.prototype方法出来的:

Array.prototype.pack = function(field) { 
    var result = [], target, lastItem; 
    while(this.length > 0) { 
     var item = this.shift(); 
     if(item === undefined) { 
      target = result; 
     } else { 
      if(!lastItem || item[field] != lastItem[field]) { 
       target = []; 
       result.push(target); 
      } 
     } 
     target.push(item); 
     lastItem = item; 
    } 
    return result; 
} 

注意它不重测试,并确保它可以提炼,但应该给你一个想法。 可以使用这样的:

models.pack("name") 

其中模型是一个普通的阵列等[未定义,{字段:值}]。

试图尽可能简洁。这里的工作演示:http://jsfiddle.net/YZQ6v/

+0

哇,爱在那里的结果。谢谢您的帮助! – gleddy 2013-05-11 06:16:55

0

您可以使用collection.groupBy()来执行此操作。第一组通过“组”来创建分组模型的散列,然后使用collection.map将兄弟映射到模型上。

这里是一个小提琴: http://jsfiddle.net/puleos/w7drB/

var models = [ 
    {name: "Scott", group: "alpha"}, 
    {name: "Rose", group: "alpha"}, 
    {name: "Charles", group: "alpha"}, 
    {name: "Stan"}, 
    {name: "John"}, 
    {name: "Mary", group: "beta"}, 
    {name: "Dan", group: "beta"}, 
    {name: "Paul", group: "beta"}, 
    {name: "Grace"}, 
    {name: "Sarah", group: "omega"} 
]; 

var SourceCollection = Backbone.Collection.extend({}); 

var sourceCollection = new SourceCollection(models); 
var grouped = sourceCollection.groupBy('group'); 

sourceCollection.map(function(model) { 
    if(model.has("group")) { 
     model.set({siblings: grouped[model.get("group")]}); 
    } 
}); 

// sourceCollection with siblings 
console.log(sourceCollection); 
相关问题