2015-06-08 12 views
5

Mam tablicę obiektów o atrybutach TechType i ProductName. Dana tablica jest już posortowana według TechType (niekoniecznie alfabetycznie); teraz w obrębie tej posortowanej tablicy, należy ją dalej sortować według rosnącej kolejności na podstawie ProductName.Sortuj posortowaną tablicę obiektów na podstawie rosnącej kolejności innego atrybutu.

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


} 
]; 

posortowanej tablicy powinna być

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

możliwe duplikat [sortowania tablicy na wartość klucza] (http://stackoverflow.com/questions/16648076/sort-array-on-key-value) – rohithpr

Odpowiedz

2

To jest trochę podobne do stabilnej rodzaju. Typowy sposób zapewnienia stabilnego sortowania polega na dodaniu danych pomocniczych, które należy posortować w przypadku, gdy elementy zostaną uznane za takie same.

Robię to tutaj za pomocą dwóch operacji na mapie, podobnie jak w przypadku transformacji Schwartzian; dane pomocnicze są używane tylko wtedy, gdy typy techniczne nie są zgodne między dwiema pozycjami.

Aby zademonstrować prawidłowe zachowanie, elementy zostały przeniesione, aby typy tech zostały uporządkowane w kolejności odwrotnej niż pytanie.

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

Powiązane problemy