2013-05-10 88 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); 
相關問題