2015-06-08 12 views
5

TechType ve ProductName özniteliklerine sahip bir dizi nesneye sahibim. Verilen dizi zaten TechType (alfabetik olarak zorunlu değildir); Şimdi bu sıralanmış dizinin içinde, ProductName'a göre artan sırada sıralanmalıdır.Başka bir özelliğin artan sırasına göre sıralanmış bir nesne dizisini sıralayın

var products= [ 
    { 
     "TechType": "ADSL", 
     "ProductName": " Zen ADSL Services", 
      }, { 
     "TechType": "ADSL", 
     "ProductName": "ADSL Services", 
      }, { 
     "TechType": "T1", 
     "ProductName": "T1-Voice", 
},{ 
     "TechType": "T1", 
     "ProductName": " Aviate T1-Voice", 


} 
]; 

sıralanan dizi

var products= [ 
     { 
      "TechType": "ADSL", 
      "ProductName": " ADSL Services", 
       }, { 
      "TechType": "ADSL", 
      "ProductName": "Zen ADSL Services", 
       }, { 
      "TechType": "T1", 
      "ProductName": " Aviate T1-Voice", 
    },{ 
      "TechType": "T1", 
      "ProductName": " T1-Voice", 


    } 
    ]; 
+0

[anahtar değerini kriteri dizi] olası çift (http://stackoverflow.com/questions/16648076/sort-array-on-key-value) – rohithpr

cevap

2

Bu biraz stabil tür ilgilidir olmalıdır. Kararlı bir sıralama sağlamanın tipik yolu, vaka kalemlerinin aynı olduğu tespit edilen yardımcı verilerin eklenmesidir.

Burada bir Schwartzian Transform için kullanacağınıza benzer iki harita işlemi kullanarak yapıyorum; yardımcı veriler sadece teknoloji türleri iki öğe arasında uyuşmuyorsa kullanılır.

Doğru davranışı göstermek için, ürün türlerini tersine sıraya göre sıralamak için öğeleri değiştirdim.

var products = [{ 
 
    "TechType": "T1", 
 
    "ProductName": "T1-Voice", 
 
},{ 
 
    "TechType": "T1", 
 
    "ProductName": "Aviate T1-Voice", 
 
}, { 
 
    "TechType": "ADSL", 
 
    "ProductName": "Zen ADSL Services", 
 
}, { 
 
    "TechType": "ADSL", 
 
    "ProductName": "ADSL Services", 
 
}]; 
 

 
function sortByStableProperty(array, prop, fn) 
 
{ 
 
    // decorate 
 
    var temp = array.map(function(item, index) { 
 
    return [item, index]; 
 
    }); 
 
    
 
    temp.sort(function(a, b) { 
 
    // sort by auxiliary data or callback function 
 
    return a[0][prop] == b[0][prop] ? fn(a[0], b[0]) : a[1] - b[1]; 
 
    }); 
 
    
 
    // undecorate 
 
    return temp.map(function(item) { 
 
    return item[0]; 
 
    }); 
 
} 
 

 
// actual sort 
 
products = sortByStableProperty(products, 'TechType', function(a, b) { 
 
    return a.ProductName.localeCompare(b.ProductName); 
 
}); 
 

 
console.log(JSON.stringify(products));
İlgili konular