Трансформация массива объектов 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));