2013-02-14 22 views
7

Dizilimi, alfabetik olarak değil, özel bir düzende nasıl sıralayabildiğimi merak ediyordum. Bu dizi/nesne var düşünün: meyve, sebze ve şeker: BuradayımÖzel bir sıraya göre sıralama

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" 
}]; 

biz 3 farklı tipi vardır. Şimdi bu diziyi sıralamak ve tüm meyvelerin ilk önce, şekerlerin meyvelerden sonra gelip sebzelerin son haline geldiğinden emin olmak istiyorum. Her türün, öğelerin alfabetik sıraya göre sıralanması gerekir.

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" 
}]; 

Herkes nasıl bunun için bir komut dosyası oluşturmak için bir fikir: Size sıraladıktan sonra bu dizi sona ereceğini, Yani temelde sortArrayOnOrder (["fruit","candy","vegetable"], "name"); gibi bir işlevi kullanacak?

+0

Ayrıca bkz birçok başka "[sıralamak nasıl] (http://www.google.de/search?q=stackoverflow+javascript+sort+array+ + nesneler) "sorular – Bergi

cevap

12

Cerbrus' kod Geliştirilmiş versiyonu:

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 değerleri atamak için = operatörünü kullanıyorum, sortOrder'den bir nesne oluşturmak için iyi bir fikir, fonksiyon her çağrıldığında 'indexOf' kullanımı ihtiyacını ortadan kaldırır. +1 – Cerbrus

+0

Müthiş. Bu işe yarıyor. Teşekkürler! – RemiDG

0

Array.sort, özel sıralama mantığı uygulayabileceğiniz bir sıralama işlevi kabul eder.

2

bu deneyin:

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. 
     } 
    } 
); 

Ayrıca, nesne bildirimi yanlış. Onun yerine:

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

Kullanımı:

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

Yani, : 's ile = işaretleri değiştirin.

+0

+1, güzel olanı. Verimlilik artırılmış bir varyant için yanıtımı görüyorum – Bergi

+0

Wups, = yerine: = ile ilgili üzgünüm. Sadece bir örnek yazdı, hiçbir şeyi makarnadan kopyalamadım ve değerleri unutmak:. Ben de haha: P – RemiDG

İlgili konular