如何使用JavaScript將相同ID的數組對象按早餐、中餐和晚餐順序合并金額?

如何使用JavaScript將相同ID的數組對象按早餐、中餐和晚餐順序合并金額?

本文介紹如何使用JavaScript高效處理數組對象,特別是將具有相同ID的對象合并,并按特定順序(例如早餐、中餐、晚餐)匯總金額。

假設我們有一個包含不同日期和類型消費數據的數組,目標是將相同ID的數據合并,并按早餐、中餐、晚餐的順序重新組織金額。

問題描述:

原始數據:

立即學習Java免費學習筆記(深入)”;

const list =[     {         id: "202301",         jine: 23,         type: "晚餐"     },     {         id: "202301",         jine: 87.5,         type: "早餐"     },     {         id: "202301",         jine: 1065.5,         type: "中餐"     },     {         id: "202302",         jine: 10,         type: "晚餐"     },     {         id: "202302",         jine: 181.5,         type: "早餐"     },     {         id: "202302",         jine: 633.5,         type: "中餐"     } ]

期望數據格式:

const expectedList =[     {         id: "202301",         jine1: 87.5,//早餐         jine2: 1065.5,//中餐         jine3: 23,//晚餐     },     {         id: "202302",         jine1: 181.5,//早餐         jine2: 633.5,//中餐         jine2: 10,//晚餐     } ]

解決方案:

我們可以利用Object.groupBy方法(需要自行實現或使用第三方庫)結合map函數來實現數據轉換。以下代碼示例展示了如何實現:

//  Object.groupBy 方法的實現 (如果你的環境不支持,需要自行添加) const groupBy = (array, key) => {   return array.reduce((result, currentValue) => {     (result[currentValue[key]] = result[currentValue[key]] || []).push(currentValue);     return result;   }, {}); };   const result = Object.entries(groupBy(list, 'id'))   .map(([k, v]) => ({     id: k,     jine1: v.find(e => e.type === '早餐')?.jine || 0,     jine2: v.find(e => e.type === '中餐')?.jine || 0,     jine3: v.find(e => e.type === '晚餐')?.jine || 0   }));  console.log(result);

代碼解釋:

  1. groupBy函數: 這個函數將原始數組按照id屬性分組,返回一個對象,其中鍵是id,值是具有相同id的對象數組。 如果你的JavaScript環境已經支持groupBy方法,則可以跳過這一步直接使用。

  2. Object.entries: 將groupBy返回的對象轉換為鍵值對數組。

  3. map函數: 遍歷鍵值對數組,對每個id及其對應的數據數組執行以下操作:

    • 使用find方法查找早餐、中餐、晚餐類型的對象,并提取其jine屬性值。
    • 使用可選鏈操作符?.處理找不到對應類型的情況,避免錯誤。
    • 使用|| 0設置默認值,如果找不到對應類型,則金額設為0。

通過此方法,我們可以有效地合并相同ID的數組元素,并按指定類型順序重新組織金額數據。 記住,如果你的JavaScript環境不支持Object.groupBy,你需要添加上述的groupBy函數實現。

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享