[英]Sort a sorted object array based on ascending order of another attribute
我有一組具有TechType
和ProductName
屬性的對象。 給定的數組已經按TechType
排序(不一定按字母順序); 現在在這個有序數組中,它必須按照ProductName
升序進一步排序。
var products= [
{
"TechType": "ADSL",
"ProductName": " Zen ADSL Services",
}, {
"TechType": "ADSL",
"ProductName": "ADSL Services",
}, {
"TechType": "T1",
"ProductName": "T1-Voice",
},{
"TechType": "T1",
"ProductName": " Aviate T1-Voice",
}
];
排序的數組應該是
var products= [
{
"TechType": "ADSL",
"ProductName": " ADSL Services",
}, {
"TechType": "ADSL",
"ProductName": "Zen ADSL Services",
}, {
"TechType": "T1",
"ProductName": " Aviate T1-Voice",
},{
"TechType": "T1",
"ProductName": " T1-Voice",
}
];
這與穩定排序有些相關。 確保穩定排序的典型方法是添加輔助數據,以便在發現項目相同時對其進行排序。
我在這里使用兩個map操作,類似於你用於Schwartzian變換的操作; 僅當技術類型在兩個項目之間不匹配時才使用輔助數據。
為了證明正確的行為,我移動了項目,以便技術類型按照問題的相反順序排序。
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.