2012-02-08 22 views
5

Hãy tưởng tượng một mẫu/Bộ sưu tập như:Làm cách nào để triển khai phân loại nhiều cấp trong trình so sánh trong 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) { 
     ... 
    } 
}); 

Làm sao tôi viết một so sánh để thực hiện một loại đa cấp không? Tôi muốn sắp xếp theo thuộc tính a của , sau đó bằng thuộc tính b và sau đó thuộc tính c.

Tôi đã hack cùng một bộ so sánh trông giống như thế này, nhưng tôi muốn biết liệu có cách nào tốt hơn/thông minh hơn không?

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

Sau đó, s trở nên được đệm đúng chỗ và phải theo thứ tự "lexical" với nhiều cấp độ. Nhưng tất cả đều cảm thấy rất thô so với vẻ đẹp của ổn định đa cấp loại trăn (nếu bằng cách nào đó đã ở trên tương đương tương tự trong 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')) 

Có cách nào tốt hơn?

Trả lời

8

Các tài liệu xương sống nói:

chức năng sánh có thể được định nghĩa là hoặc là một SortBy (thông qua một chức năng mà phải mất một đối số duy nhất), hoặc như một loại (vượt qua một so sánh chức năng mà cần hai đối số).

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

Bạn có thể sử dụng cách thứ hai và thực hiện so sánh của bạn dựa trên hai yếu tố nhất định.

Có lẽ một cái gì đó như thế này:

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

Vâng, tính năng này đã được giới thiệu trong xương sống 0,9, một tuần trước đây. Nó đáng đọc lịch sử phiên bản. – biziclop

+0

Ah, well ... Tôi đoán tôi nên cập nhật xương sống của tôi (Tôi đang ở trên 0.5.3) ... – dlamotte

+0

Sẽ là tốt để xem ai đó thực hiện cho nó bằng cách sử dụng phương pháp mới này quá mặc dù – dlamotte

Các vấn đề liên quan