那天我遇到這樣的一個情況,我接的圖表API傳來了各分公司的業績數據,但是分公司的順序並沒有照編號排序,我知道如果直接跑圖表,PM大人之後依定會要求要排序,而有排序的分公司列表是另外一支API傳來的資料,所以我必須依照有序的資料去排那份無序的公司業績數據。
該怎麼做呢?以下例說明:
超級英雄管理局有一份可以出任務的超級英雄清單,清單中英雄都已經有編號,按照順序排好,但是超級英雄們並不知道自己的編號。
const originData=[
{
"ID": "A01",
"Name": "鋼鐵人",
},
{
"ID": "A02",
"Name": "蜘蛛人",
},
{
"ID": "A03",
"Name": "超人",
},
{
"ID": "A04",
"Name": "雷神",
},
{
"ID": "A04",
"Name": "蝙蝠俠",
},
]
有一次雷神、蜘蛛人、鋼鐵人出任務在外,他們必須按照編號順序上去和薩諾斯打架,
const chaosData = [
"雷神","蜘蛛人","鋼鐵人"
]
請把chaosData的順序排成跟originData一樣。
首先,使用 reduce 方法遍歷 originData,並創建一個 orderMap,將 originData 中的 Name 與其 ID 對應起來。利用 reduce 累加的特性,把Name當成屬性名稱,把ID當成值,組成一個新的物件。
const orderMap = originData.reduce((map, obj) => {
map[obj.Name] = obj.ID;
return map;
}, {});
以上會得到一組這樣的資料:
{
"鋼鐵人": "A01",
"蜘蛛人": "A02",
"超人": "A03",
"雷神": "A04",
"蝙蝠俠": "A04"
}
然後,使用 sort 方法對 chaosData 進行排序。在排序函式中,我們通過查詢 orderMap 來獲取 chaosData 中每個元素的對應 ID,並根據它們的字母順序進行排序。
chaosData.sort((a, b) => {
const indexA = orderMap[a];
const indexB = orderMap[b];
return indexA.localeCompare(indexB);
});
