2012-03-02 39 views
10

Tôi có bộ sưu tập xương sống có một loạt các kiểu có thuộc tính ngày được liên kết với chúng. Tôi muốn sắp xếp chúng dựa trên ngày của chúng. Vì vậy, những ngày mới nhất đầu tiên và như vậy. Whats cách tốt nhất để giải quyết vấn đề này.Sử dụng dấu gạch dưới để sắp xếp bộ sưu tập dựa trên ngày

Ngày được định dạng như thế này, một đối tượng ngày cơ bản. Ngày {Môn ngày 05 tháng ba năm 2012 23:30:00 GMT-0500 (EST)}

Cảm ơn

Trả lời

36

Bạn có ngày đối tượng, do đó bạn có thể sử dụng getTime để chuyển đổi chúng sang số và sau đó phủ nhận những con số để nhận được nhiều nhất -những ngày đầu tiên. Nếu bạn muốn giữ bộ sưu tập của mình được sắp xếp thì một bộ so sánh như sau:

C = Backbone.Collection.extend({ 
    //... 
    comparator: function(m) { 
     return -m.get('date').getTime(); 
    } 
}); 

sẽ thực hiện thủ thuật. Demo (mở giao diện điều khiển của bạn xin vui lòng): http://jsfiddle.net/ambiguous/htcyh/

bộ sưu tập Backbone cũng include gạch của sortBy vì vậy bạn có thể làm một loại một lần:

var sorted = c.sortBy(function(m) { return -m.get('date').getTime() }); 

Demo: http://jsfiddle.net/ambiguous/FF5FP/

Hoặc bạn có thể sử dụng toArray để có được một mảng JavaScript bình thường và sử dụng tiêu chuẩn sort mà không cần sử dụng getTime:

var sorted = c.toArray().sort(function(a, b) { 
    a = a.get('date'); 
    b = b.get('date'); 
    if(a > b) 
     return -1; 
    if(a < b) 
     return 1; 
    return 0; 
}); 

Demo: http://jsfiddle.net/ambiguous/QRmJ4/

+0

Tôi thích phương pháp so sánh rất sạch sẽ và đơn giản. Một câu hỏi mà tôi có là có cách để đảo ngược. Vì vậy, ngày càng gần đến ngày hiện tại sẽ là ngày đầu tiên và không phải là ngày cuối cùng như nó đang sử dụng như sau. so sánh: hàm (m) { trả về m.get ('date'). getTime(); } – Chapsterj

+0

Tôi chỉ nhận ra rằng ngày của tôi không phải là một đối tượng ngày tháng nhưng là một giá trị của 201203051400 vì vậy tôi đoán đó là nguyên nhân gây ra vấn đề. Có cách nào để đối phó với giá trị chuỗi và vẫn sử dụng cùng một thiết lập hoặc nó sẽ là tốt hơn để biến giá trị thành một đối tượng ngày đầu tiên và sau đó làm phương pháp so sánh. – Chapsterj

+0

@Chapsterj: Nếu bạn có các đối tượng Date thì bạn có thể xem 'your_date - new Date' hoặc' new Date - your_date' khi thích hợp. Nếu ngày của bạn là chuỗi ISO-8601-ish thì bạn có thể chuyển đổi chúng thành Ngày tháng trong hàm so sánh hoặc bạn (IMHO tốt hơn) chuyển đổi chúng thành Đối tượng ngày khi bạn tải và phân tích dữ liệu của mình. –

3

Nếu bạn có các chuỗi với thông tin cập nhật, bạn có thể ....

C = Backbone.Collection.extend({ 
///... 
    comparator: function(m) { 
     return -Date.parse(m.get('datestring')); 
    } 
}); 
Các vấn đề liên quan