Tôi nhận ra điều này đã được hỏi một thời gian trước, nhưng tôi nghĩ rằng tôi sẽ thêm giải pháp của mình.
Hàm này tạo ra các phương thức sắp xếp động. chỉ cần cung cấp từng tên thuộc tính con có thể sắp xếp, được thêm vào trước +/- để biểu thị thứ tự tăng dần hoặc giảm dần. Siêu tái sử dụng và nó không cần biết bất cứ điều gì về cấu trúc dữ liệu bạn đã tổng hợp lại. Có thể được làm bằng chứng ngu ngốc - nhưng dường như không cần thiết.
function getSortMethod(){
var _args = Array.prototype.slice.call(arguments);
return function(a, b){
for(var x in _args){
var ax = a[_args[x].substring(1)];
var bx = b[_args[x].substring(1)];
var cx;
ax = typeof ax == "string" ? ax.toLowerCase() : ax / 1;
bx = typeof bx == "string" ? bx.toLowerCase() : bx / 1;
if(_args[x].substring(0,1) == "-"){cx = ax; ax = bx; bx = cx;}
if(ax != bx){return ax < bx ? -1 : 1;}
}
}
}
ví dụ sử dụng:
items.sort (getSortMethod ('- price', '+ priority', '+ name'));
điều này sẽ sắp xếp items
với mục thấp nhất price
trước tiên, với các mối quan hệ sẽ đến mục có giá trị cao nhất priority
. mối quan hệ hơn nữa bị phá vỡ bởi mụcname
trong đó các mục là một mảng như:
var items = [
{ name: "z - test item", price: "99.99", priority: 0, reviews: 309, rating: 2 },
{ name: "z - test item", price: "1.99", priority: 0, reviews: 11, rating: 0.5 },
{ name: "y - test item", price: "99.99", priority: 1, reviews: 99, rating: 1 },
{ name: "y - test item", price: "0", priority: 1, reviews: 394, rating: 3.5 },
{ name: "x - test item", price: "0", priority: 2, reviews: 249, rating: 0.5 } ...
];
bản demo trực tiếp: http://gregtaff.com/misc/multi_field_sort/
CHỈNH SỬA: Đã khắc phục sự cố với Chrome.