簡體   English   中英

JavaScript-在多個相同長度的對象數組中組合和添加值

[英]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
    }
]

我編寫了一個腳本來檢查以確保datetotal屬性中的所有值都以它們所需的方式存在,但是我仍然遇到了錯誤的數組。 這里的假設是我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM