2012-02-08 6 views
5

bir Model düşünün/Koleksiyon gibi:Backbone.js/underscore.js içinde karşılaştırıcıda çok düzeyli bir sıralama nasıl uygulanır?

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) { 
     ... 
    } 
}); 

nasıl çok düzeyli sıralama uygulamak için bir karşılaştırıcı yazabilirim? AModel adlı kullanıcının a özniteliğini, ardından b özniteliğini ve c özniteliğini kullanarak sıralamak istiyorum.

Böyle bir şeye benzeyen bir karşılaştırıcıyı bir araya getirdim ama daha iyi/akıllı bir yol olup olmadığını bilmek istiyorum.

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; 
} 

Daha sonra, s doğru boşluklarla takviye olur ve çok düzeyde ile "sözcük" sırada olmalıdır.

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

daha iyi bir yolu var mı: (yukarıda Python benzer eşdeğerleri vardı nasılsa ise) Ama hepsi Python en istikrarlı çok seviyeli tür güzelliği göre çok brüt hissediyor?

cevap

8

omurga belgeleri söyler:

Karşılaştırıcı fonksiyonu SortBy bir işlev (tek bir argüman alır geçmesi) ya da bir tür olarak (iki bağımsız değişkeni beklediği bir karşılaştırma fonksiyonu geçmek ya olarak tanımlanabilir).

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

Sen verilen iki unsurları dayalı karşılaştırma ikinci yolu kullanıp uygulayabilir. Böyle

Belki bir şey:

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

Evet, bu özellik bir hafta önce, omurga 0.9 tanıtıldı. Sürüm geçmişini okumaya değer. – biziclop

+0

Ah, peki ... Benim omurgamı güncellemeliyim (0.5.3'teyim) ... – dlamotte

+0

Bu yeni yöntemi kullanarak someones uygulamasını görmek güzel olurdu. – dlamotte