接收条件推送数组的重复结果

receiving repetitive result for conditional push array

我正在尝试根据它们的公共对象键将我的对象数组转换为新的对象数组,并对每个对象的所有其他属性求和。但我不知道为什么我一直收到一个项目编号正确但项目重复的数组(最后一个新对象)。这是代码:

function(){
    const list = [
        {
            amount: 0,
            date: '2018-11-29',
            source: 'a'
        }
        {
            amount: 2,
            date: '2018-11-29',
            source: 'b'
        }
        {
            amount: 3,
            date: '2018-11-30',
            source: 'b'
        }
    ]
    const daysGroup = []

    let dayGroup = {
            date: list[0].date,
            a: '',
            b: ''
        }

    for (let i = 0; i < list.length; i++) {
        

        if(dayGroup.date === list[i].date){
            switch (list[i].source) {
                case 'a':
                    dayGroup.a += Number(list[i].amount)
                    break;
                case 'b':
                    dayGroup.b += Number(list[i].amount)
                    break;

                default:
                    break;
            }
            console.log(dayGroup) 

        } else{
            console.log(dayGroup)
            daysGroup.unshift(dayGroup)

            dayGroup.date = list[i].date
            switch (list[i].source) {
                case 'a':
                    dayGroup.a += Number(list[i].amount)
                    break;
                case 'b':
                    dayGroup.b += Number(list[i].amount)
                    break;

                default:
                    break;
            } 
        } 
        
    }
    console.log(daysGroup) 
    return daysGroup
}

这是我得到的结果:

[
    {
    date: '2018-11-30',
    a: 0,
    b: 3
    },
    {
    date: '2018-11-30',
    a: 0,
    b: 3
    },
    {
    date: '2018-11-30',
    a: 0,
    b: 3
    }
]

在堆栈中进行搜索时,我意识到有些人通过将新的虚拟对象放入 for 循环中解决了这个问题。但这弄乱了我正在寻找的结果。

我的目标是得到这样的结果:

[
    {
    date: '2018-11-29',
    a: 0,
    b: 2
    },
    {
    date: '2018-11-30',
    a: 0,
    b: 3
    }
]

您可以使用 Array.reduce 以更简洁的方式解决此问题:

const list = [{ amount: 0, date: '2018-11-29', source: 'a' }, { amount: 2, date: '2018-11-29', source: 'b' }, { amount: 3, date: '2018-11-30', source: 'b' } ] 

const result = list.reduce((r, {date, amount, source}) => {
  r[date] = r[date] || {date, a: 0, b: 0}
  r[date][source] += amount
  return r
}, {})

console.log(Object.values(result))

我们的想法是 group 通过 date 并且在这样做的同时不断总结 source 金额。