如何从对象数组的元素之和创建新对象



我正在用一个对象数组进行数据操作练习,我想把数组中所有对象的收入和支出相加,然后返回一个对象,我用一个"正确的";但它很脏,我想知道是否有一种更干净的方法来做代码
这是对象数组:

const projects = [
{
amount: 26800,
type: 'expense',
},
{
amount: 2600,
type: 'income',
},
{
amount: 6890,
type: 'expense',
},
{
amount: 901800,
type: 'expense',
},
...
];

这是我的代码javascript:

const dato = () => {
let income = 0;
let expense = 0;
const total = projects.map((project) => {
income += project.type === 'income' ? project.amount : 0;
expense += project.type === 'expense' ? project.amount : 0;
return {
income,
expense,
byTotal: {
total: income - expense,
},
};
});
console.log(total[total.length - 1]);
};

我要创建的对象如下。

{
income: 3900000,
expense: 2293600,
byTotal: {
total: 1606400,
}
}

您可以使用reduce而不是map,并使用Object.assign对累加器对象中的金额求和:

const projects = [{amount: 26800,type: 'expense',},{amount: 2600,type: 'income',},{amount: 6890,type: 'expense',},{amount: 901800,type: 'expense',},];
const dato = () => {
const {income, expense} = projects.reduce(
(acc, {type, amount}) => Object.assign(acc, {[type]: acc[type] + amount}),
{income: 0, expense: 0}
);
const total = {income, expense, byTotal: {total: income - expense}};
console.log(total);
};
dato();

您可以使用reduce

const total = projects.reduce(
(acc, cur) => {
if (cur.type == 'income') acc.income += cur.amount;
if (cur.type == 'expense') acc.expense += cur.amount;
acc.byTotal.total += acc.income - acc.expense;
return acc;
},
{
income: 0,
expense: 0,
byTotal: {
total: 0,
},
}
);

您可以根据一行中的类型减去或添加amount来使用reducer

const projects = [{
amount: 26800,
type: 'expense',
},
{
amount: 2600,
type: 'income',
},
{
amount: 6890,
type: 'expense',
},
{
amount: 901800,
type: 'expense',
}
];
const sum = projects.reduce(
(amount, object) =>
amount + (object.type === "expense" ? -object.amount : object.amount),
0
);
console.log(sum)

最新更新