получение повторяющегося результата для условного массива push - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь превратить мой массив объектов в новый массив объектов, основываясь на их общем ключе объекта и суммируя все остальные свойства каждого объекта.Но я не знаю, почему я продолжаю получать массив с правильным номером элемента, но повторяющимися элементами (с последним новым объектом).вот код:

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

1 Ответ

0 голосов
/ 30 ноября 2018

Вы можете решить эту проблему более кратко с помощью 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.

...