2013-05-30 35 views
8

Tôi muốn sắp xếp một mảng theo cách tùy chỉnh. Ví dụ sẽ là classlevel của học sinh:làm thế nào để bạn áp dụng một loại tùy chỉnh cho một mảng?

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(classlevel){ 
    // ?? 
}) 

Lý tưởng nhất, các loại nên trả lại:

["Freshman","Sophomore","Junior","Senior"] 

Tôi nghĩ tôi có thể pre-rank các classlevels trước thời hạn như thế này:

var classlevelRanked = [{ class: "Junior", 
    rank: 3 
},{ class: "Senior", 
    rank: 4 
},{ class: "Freshman", 
    rank: 1 
},{ class: "Sophomore", 
    rank: 2 
}] 

và sau đó áp dụng sắp xếp qua:

_.sortBy(classlevelRanked, function(classlevel){ 
    return classlevel.rank; 
}) 

Nhưng sau đó tôi phải loại bỏ hàng ngũ bằng cách thực hiện:

.map(function(classlevel){ 
    return classlevel["class"]; 
}) 

Có cách trực tiếp hơn để làm điều này mà không cần tiền đứng classlevels và sau đó tước nó ra sau đó?

Trả lời

31

Bạn sẽ có thể làm điều gì đó như thế này:

_.sortBy(["Junior","Senior","Freshman","Sophomore"], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element]; 
}); 

Fiddle:

http://jsfiddle.net/hKQj8/

+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn!! – Kevin

+0

JS 101: xếp hạng của bạn bên ngoài câu lệnh gọi lại, không cần phải xác định lại 'xếp hạng' mỗi lần ... – mpowered

+0

@mpowered, tôi nghĩ rằng đó có thể là một tối ưu hóa sớm. Trình duyệt sẽ có thể nhận ra nó như là một hằng số và biên dịch nó một lần. Bạn cũng có thể viết hai hàm: một hàm khai báo xếp hạng và trả về hàm thứ hai làm xếp hạng. Di chuyển 'xếp hạng' bên ngoài phạm vi chức năng gây ô nhiễm phạm vi toàn cầu, và nó vì nó chỉ áp dụng cho hàm đó, nên tốt hơn là có nó ở đó. – Jason

4

Do đó các/cách xấu siêu hackish !!!! Chết đơn giản/điên rồ khó hiểu :)

function rank(word){ 
    return Math.abs(113-word.trim().toLowerCase().charCodeAt(1)); 
} 

console.log(rank('freshman')); // 1 
console.log(rank('sophomore')); // 2 
console.log(rank('junior')); // 4 
console.log(rank('senior')); // 12 

Edit:

Kể từ khi mọi người dường như việc tìm kiếm câu trả lời này hữu ích, đây là một lời giải thích về cách hoạt động ... Nó loại dựa trên một bức thư trong từ được cung cấp. Kể từ khi "thứ hai" và "cao cấp" có một chữ cái đầu tiên trùng lặp, tôi đã chọn để sắp xếp theo chữ thứ hai mỗi từ có một giá trị duy nhất cho điều đó.

Điều này sau đó sẽ sắp xếp theo cách này: sEnior, sOphomore, fReshman, jUnior. Để sắp xếp chúng đúng cách, tôi đã trừ đi bằng cách sử dụng mã ký tự cho Q (113) nằm ngay cạnh R (đối với sinh viên năm nhất). Điều đó có nghĩa là cách đóng chữ cái thứ hai của mỗi từ là Q xác định thứ tự. Để ngăn chặn các số âm, hàm này lấy giá trị tuyệt đối của kết quả và trả về giá trị đó.

+2

Chính xác những gì tôi đang tìm kiếm! Cảm ơn bạn!!! –

+1

Tuyệt vời! Hoạt động hoàn hảo –

5

Ngoài câu trả lời của Jason:

var list = _.sortBy([{name:"Junior"},{name:"Senior"},{name:"Freshman"},{name:"Sophomore"}], function(element){ 
    var rank = { 
     "Junior" : 3, 
     "Senior" : 4, 
     "Freshman" :1, 
     "Sophomore" :2 
    }; 

    return rank[element.name]; 
}); 

console.dir(list); 

Nó sẽ giúp để sắp xếp mảng các đối tượng

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