Трансформация массива объектов JS

Массив объектов вида:

const dayTransactions = [
    { currency: 'USD', amount: 60, operation: 'sell' },
    { currency: 'EUR', amount: 160, operation: 'buy' },
    { currency: 'EUR', amount: 90, operation: 'sell' },
];

Нужно привести, учитывая 'sell' и 'buy', к виду:

[
  {USD: 60},
  {EUR: 70}
]

Ответы (3 шт):

Автор решения: Denis640Kb

Логично было бы сделать, если sell - то прирост денег.
Если buy то минус денег.
Соответственно и разница должны быть sell - buy, в Вашем варианте -70, а не 70.

    let val = [
    { currency: 'USD', amount: 60, operation: 'sell' },
    { currency: 'EUR', amount: 160, operation: 'buy' },
    { currency: 'EUR', amount: 90, operation: 'sell' },
    ];

    let result = new Object();
    let result1 = [];
    for(let i=0;i<val.length;i++){
        if (typeof result[val[i]['currency']] !== "undefined") {
            if(val[i]['operation'] == 'sell'){
                result[val[i]['currency']] += val[i]['amount'];
            } else if(val[i]['operation'] == 'buy'){
                result[val[i]['currency']] -= val[i]['amount'];
            }
        } else {
            if (val[i]['operation'] == 'sell') {
                result[val[i]['currency']] = val[i]['amount'];
            } else if (val[i]['operation'] == 'buy') {
                result[val[i]['currency']] = -1 * val[i]['amount'];
            }
        }
    }
    result1.push(result);

    console.log(result1);

→ Ссылка
Автор решения: nörbörnën

Array.prototype.reduce() метод reduce() применяет функцию reducer к каждому элементу массива (слева-направо), возвращая одно результирующее значение.

const dayTransactions = [
    { currency: 'USD', amount: 60, operation: 'sell' },
    { currency: 'EUR', amount: 160, operation: 'buy' },
    { currency: 'EUR', amount: 90, operation: 'sell' },
];

const res = dayTransactions.reduce(
    (acc, x) => {
        if (!(x.currency in acc)) {
            acc[x.currency] = 0;
        }
        acc[x.currency] += (x.operation === 'sell' ? -1 : 1) * x.amount;
        return acc;
    },
    {}
);

console.log(res);

→ Ссылка
Автор решения: prgv

Предположим, что комментаторы выше правы. И вам действительно нужно найти разницу между sell и buy по каждому currency. Тогда предлагаю воспользоваться .reduce.

const dayTransactions = [
    { currency: 'USD', amount: 60, operation: 'sell' },
    { currency: 'EUR', amount: 160, operation: 'buy' },
    { currency: 'EUR', amount: 90, operation: 'sell' },
];

const con = (obj) => obj.reduce((acc, rec) => {
  return { ...acc, [rec.currency]: (acc[rec.currency] || 0) + (rec.amount * (rec.operation === 'sell' ? 1 : -1)) }
  }, {})

console.log(con(dayTransactions));

→ Ссылка