2012-02-14 62 views
5

Tôi có một mảng đối tượng được gọi là objarray. Mỗi đối tượng trông như thế này:Tách mảng đối tượng thành mảng mới dựa trên năm của ngày của đối tượng

var object = { 
    age: "45" 
    coords: "-37.807997 144.705784" 
    date: Sun Jul 28 2002 00:00:00 GMT+1000 (EST) 
} 

(ngày là một đối tượng Date)

tôi cần phải đẩy mỗi đối tượng vào một mảng mới dựa trên ngày tháng. Tôi muốn kết quả cuối cùng trông như thế này:

var dateGroups = [[object, object, object],[object, object], [object, object, object]]; 

Mỗi mảng trong dateGroups chứa các đối tượng với cùng ngày.

Điều này có thể thực hiện với các mảng không? Trước đây tôi tạo ra một đối tượng mới trong đó có tất cả các objarray đối tượng được nhóm theo ngày (ngày tạo ra từ các dữ liệu):

var alldates = { 
    "1991" : [object, object, object], 
    "1992" : [object, object], 
    //etc... 
} 

này dường như ở trên như một giải pháp kỳ lạ trong thực tế, mặc dù tôi chỉ cần để có thể truy cập vào các đối tượng theo năm: tức là dateGroups [0] = mảng của các đối tượng từ năm đầu tiên

Làm thế nào tôi sẽ nhận được dữ liệu vào một cái gì đó giống như dateGroups mảng? Có cách nào tốt hơn để lưu trữ loại dữ liệu này không?

+0

tốt hơn để chọn JSON cho việc này. –

+0

Cấu trúc JSON nào phù hợp với nhóm theo ngày? – tamarasaurus

Trả lời

7

Cân nhắc sử dụng chức năng Underscore.jsgroupBy, tiếp theo là sortBy.

groupBy sẽ tạo ra một cấu trúc như alldates, nếu bạn gọi nó như vậy:

var alldates = _.groupBy(objarray, function(obj) { 
    return obj.date.getFullYear(); 
}); 

sortBy có thể được sử dụng để chỉ đơn giản là sắp xếp theo chủ chốt, như thế này:

var dateGroups = _.sortBy(alldates, function(v, k) { return k; }); 

Bạn cũng có thể kết hợp cả hai như sau:

var dateGroups = _.chain(objarray) 
        .groupBy(function(obj) { return obj.date.getFullYear(); }) 
        .sortBy(function(v, k) { return k; }) 
        .value(); 

D trong trường hợp sử dụng của bạn, tôi có thể thấy lý do cho việc sử dụng một mảng các mảng hoặc một bản đồ đối tượng của các mảng. Nếu bạn đang tìm kiếm trên chỉ mục, chắc chắn sử dụng sau này.

+0

Điều này làm việc tuyệt vời. Cảm ơn! Tôi chắc chắn sẽ cần phải sử dụng các chỉ mục sau này. – tamarasaurus

0

Một khi bạn có những ngày trong một cấu trúc trông như thế này:

var alldates = { 
    "1991" : [object, object, object], 
    "1992" : [object, object], 
    //etc... 
} 

Bạn chỉ có thể sử dụng mã này để chuyển đổi chúng sang cấu trúc bạn muốn:

var dateGroups = []; 

for(var year in allDates){ 
    dateGroups[dateGroups.length] = allDates[year]; 
} 
0

Một câu trả lời bằng giảm .

mức giảm đầu tiên là để nhóm các đối tượng theo ngày và thứ hai là tạo khóa của chuỗi từ 0 đến số năm khác - thay vì khóa là năm.

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