2013-02-14 56 views
7

Tôi đã tự hỏi làm thế nào tôi có thể sắp xếp một mảng theo thứ tự tùy chỉnh, chứ không phải theo thứ tự bảng chữ cái. Hãy tưởng tượng bạn có mảng/đối tượng này:Sắp xếp theo thứ tự tùy chỉnh

var somethingToSort = [{ 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "fruit", 
    name: "apple" 
}]; 

Ở đây, chúng tôi có 3 loại khác nhau: trái cây, rau và kẹo. Bây giờ tôi muốn sắp xếp mảng này, và chắc chắn rằng tất cả các loại trái cây là đầu tiên, kẹo đến sau khi trái cây, và rau quả là cuối cùng. Mỗi loại cần các mục của chúng được sắp xếp theo thứ tự bảng chữ cái. Chúng tôi sẽ sử dụng một chức năng như sortArrayOnOrder (["fruit","candy","vegetable"], "name"); Vì vậy, về cơ bản, bạn sẽ kết thúc với mảng này sau khi phân loại:

var somethingToSort = [{ 
    type: "fruit", 
    name: "apple" 
}, { 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}]; 

Bất cứ một ý tưởng làm thế nào để tạo ra một kịch bản cho việc này?

+0

Xem thêm nhiều người khác "[làm thế nào để sắp xếp] (http://www.google.de/search?q=stackoverflow+javascript+sort+array+ của + đối tượng) "câu hỏi – Bergi

Trả lời

12

Phiên bản cải tiến của mã Cerbrus':

var ordering = {}, // map for efficient lookup of sortIndex 
    sortOrder = ['fruit','candy','vegetable']; 
for (var i=0; i<sortOrder.length; i++) 
    ordering[sortOrder[i]] = i; 

somethingToSort.sort(function(a, b) { 
    return (ordering[a.type] - ordering[b.type]) || a.name.localeCompare(b.name); 
}); 
+0

Hm, ý tưởng tốt để xây dựng một đối tượng ra khỏi sortOrder, loại bỏ nhu cầu sử dụng 'indexOf' mỗi lần hàm được gọi. +1 – Cerbrus

+0

Tuyệt vời. Điều đó hoạt động. Cảm ơn! – RemiDG

0

Array.sort chấp nhận chức năng sắp xếp nơi bạn có thể áp dụng logic sắp xếp tùy chỉnh.

2

Hãy thử điều này:

var sortOrder = ['fruit','candy','vegetable']; // Declare a array that defines the order of the elements to be sorted. 
somethingToSort.sort(
    function(a, b){        // Pass a function to the sort that takes 2 elements to compare 
     if(a.type == b.type){     // If the elements both have the same `type`, 
      return a.name.localeCompare(b.name); // Compare the elements by `name`. 
     }else{         // Otherwise, 
      return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type); // Substract indexes, If element `a` comes first in the array, the returned value will be negative, resulting in it being sorted before `b`, and vice versa. 
     } 
    } 
); 

Ngoài ra, tuyên bố đối tượng của bạn là không chính xác. Thay vì:

{ 
    type = "fruit", 
    name = "banana" 
}, // etc 

Sử dụng:

{ 
    type: "fruit", 
    name: "banana" 
}, // etc 

Vì vậy, hãy thay = dấu hiệu với : 's.

+0

+1, đẹp nhất. Xem câu trả lời của tôi cho một biến thể hiệu quả cải tiến – Bergi

+0

Wups, xin lỗi về = thay vì:. Chỉ cần viết một ví dụ ở đây, đã không sao chép mì ống bất cứ điều gì và quên về: để gán giá trị. Im quá sử dụng để sử dụng toán tử = để gán giá trị haha: P – RemiDG

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