JS陣列方法-以有序排列無序

那天我遇到這樣的一個情況,我接的圖表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);
});