本文介紹如何使用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);
代碼解釋:
-
groupBy函數: 這個函數將原始數組按照id屬性分組,返回一個對象,其中鍵是id,值是具有相同id的對象數組。 如果你的JavaScript環境已經支持groupBy方法,則可以跳過這一步直接使用。
-
Object.entries: 將groupBy返回的對象轉換為鍵值對數組。
-
map函數: 遍歷鍵值對數組,對每個id及其對應的數據數組執行以下操作:
- 使用find方法查找早餐、中餐、晚餐類型的對象,并提取其jine屬性值。
- 使用可選鏈操作符?.處理找不到對應類型的情況,避免錯誤。
- 使用|| 0設置默認值,如果找不到對應類型,則金額設為0。
通過此方法,我們可以有效地合并相同ID的數組元素,并按指定類型順序重新組織金額數據。 記住,如果你的JavaScript環境不支持Object.groupBy,你需要添加上述的groupBy函數實現。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END