2012-02-08 34 views
5

想象一下,一個型號/系列,如:如何在Backbone.js/underscore.js中實現比較器中的多級排序?

var AModel = Backbone.Model.extend({ 
    defaults: { 
     a: 'a string', 
     b: 'another string', 
     c: 'yet another string' 
    } 
}); 

var ACollection = Backbone.Collection.extend({ 
    model: AModel, 
    comparator: function(amodel) { 
     ... 
    } 
}); 

我怎麼會寫一個比較,以實現多層次排序?我想按AModela屬性排序,然後按其b屬性排序,然後按其屬性排序。

我把一個比較器看起來像這樣,但我想知道是否有更好/更聰明的方法?

comparator: function(amodel) { 
    var s = '', 
     assumed_max_length_of_any_attribute = 30; 

    s += amodel.get('a'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    s += amodel.get('b'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    s += amodel.get('c'); 
    while (s.length < assumed_max_length_of_any_attribute) { 
     s += ' '; 
    } 

    return s; 
} 

然後,s變得正確使用空格,並應與多層次的「詞彙」命令。但是,這一切比起Python的穩定的多級排序的美女給人的感覺非常總值(如果不知何故上述曾在蟒蛇類似當量):

collection.sort(key=lambda x: x.get('c')) 
collection.sort(key=lambda x: x.get('b')) 
collection.sort(key=lambda x: x.get('a')) 

有沒有更好的辦法?

回答

8

骨幹文檔說:

比較器功能可以被定義爲一個sortBy(傳遞函數 採用單個參數),或作爲一種(通過比較器 功能需要兩個參數)。

http://documentcloud.github.com/backbone/#Collection-comparator

你可以使用第二種方法,實現你的比較基礎上給出了兩個元素。

也許是這樣的:

helper: function (c1, c2) { 
    if (c1 < c2) return -1; 
    if (c1 > c2) return +1; 
    return 0; 
} 
comparator: function (model1, model2) { 
    return _.reduce(["c", "b", "a"], function (acc, comp) { 
     return acc !== 0 ? acc : this.helper(model1[comp], model2[comp]) 
    }, 0); 
} 
+3

是,這個功能是在骨幹網引入了0.9,一個星期前。它值得閱讀版本歷史。 – biziclop 2012-02-08 21:02:16

+0

嗯,好吧......我想我應該更新我的骨幹(我在0.5.3)...... – dlamotte 2012-02-08 21:04:11

+0

雖然 – dlamotte 2012-02-08 21:04:34