[英]JavaScript - Combine and Add Values in Multiple Same Length Object Arrays
我希望通過匹配相同的日期字符串來減少對象數組,並將這些匹配日期的總數相加,然后將它們組合為一個對象。 我可以將陣列放置成幾千個項目,因此我試圖增加(在可能的情況下)和復雜性。
// before
let objArr = [
{
date: '01/01/2018',
total: 1
},
{
date: '01/01/2018',
total: 2
},
{
date: '01/02/2018',
total: 3
},
{
date: '01/02/2018',
total: 4
},
...
]
// final result
let finalArr = [
{
date: '01/01/2018',
total: 3
},
{
date: '01/02/2018',
total: 7
},
...
]
我似乎無法掌握使用reduce減少它們的技巧:
objArr.reduce((acc, obj) => {
acc.set(obj.date, (acc.get([obj.date]) || 0) + obj.total);
return acc;
}, new Map())
結果總是以錯誤的總數結尾,或者最后幾個數組對象看起來像:
// bad output
badArray = [
...,
{
date: '01/02/2018',
total: 4
},
{
date: undefined,
total: NaN
},
{
date: undefined,
total: NaN
}
]
我編寫了一個腳本來檢查以確保date
和total
屬性中的所有值都以它們所需的方式存在,但是我仍然遇到了錯誤的數組。 這里的假設是我的reduce函數不正確。
您的代碼幾乎是正確的。 問題是您將Map鍵設置為日期,但是試圖通過傳遞帶有日期而不是日期的數組來get
該項。
您可能在需要時使用acc.get([obj.date])
: acc.get(obj.date)
(無[ ]
)
let objArr = [{date: '01/01/2018',total: 1},{date: '01/01/2018',total: 2},{date: '01/02/2018',total: 3},{date: '01/02/2018',total: 4},] let s = objArr.reduce((acc, obj) => { // not acc.get([obj.date]) ! acc.set(obj.date, (acc.get(obj.date) || 0) + obj.total); return acc; }, new Map()) // turn the Map into something that will display: console.log([...s.entries()].map(([date, total]) => ({date, total})))
我認為Mark Meyer的答案很好,但這也是另一個選擇,它使用空數組作為初始值而不是Map(在整個過程中保持輸入的原始結構):
let objArr = [{date: '01/01/2018',total: 1},{date: '01/01/2018',total: 2},{date: '01/02/2018',total: 3},{date: '01/02/2018',total: 4},]; const result = objArr.reduce((acc, obj) => { const existingObj = acc.find((o) => o.date === obj.date); if (existingObj) { existingObj.total += obj.total; } else { acc.push(obj); } return acc; }, []); console.log(result);
請注意,使用空數組作為初始值的好處是它可以保持輸入的原始結構(因此您不必隨后遍歷生成的Map並將其轉換為對象數組)。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.