我正在运行这个累加器,它工作得很好,但我发现在同一个对象中添加一些属性具有挑战性:
let expenseCategories = expenseObj.reduce((acc, obj) => {
let category = obj['category'];
// let amount = obj['amount'];
if (category in acc) {
acc[category] += 1;
} else {
acc[category] = 1;
}
return acc;
}, {});
{交通:2,食物:1,衣服:1,账单:2,乐趣:1,……}
我的初始对象还包含交易金额
{amount: 10, category: "Transportation", date: 20190510, expense: true, ...
{amount: 20, category: "Drinks", date: 20190510, expense: true, ...
{amount: 30, category: "Bills", date: 20190510, expense: true, ...
{amount: 40, category: "Bills", date: 20190510, expense: true, ...
我的目标是计算每个类别的总和,bills
如上例所示,为 70。
我希望添加此信息以显示一些图表,预期的数组如下所示:
0: {name: "Transportation", value: 2, total: 123}
1: {name: "Food", value: 1, total: 456}
2: {name: "Clothes", value: 1, total: 789}
这是我对我已有的正确数据的尝试:
let outExpense = Object.entries(expenseCategories).map(([name, value]) => ({ name, value }));
这应该是动态的,因为在运行代码之前我不知道类别。这些是用户输入。请指教。谢谢
您正在计算每个 的出现次数category
。你需要稍微改变你的实现。您可以在输出数组中创建您需要的对象作为值,而不是创建一个数字作为值。然后,只需Object.values()
在累加器对象上使用即可获取分组值数组
const expenseObj = [{amount: 10, category: "Transportation", date: 20190510, expense: true},
{amount: 20, category: "Drinks", date: 20190510, expense: true},
{amount: 30, category: "Bills", date: 20190510, expense: true},
{amount: 40, category: "Bills", date: 20190510, expense: true}]
let groupCategories = expenseObj.reduce((acc, obj) => {
let { category, amount } = obj;
if (category in acc) {
acc[category].value++;
acc[category].total += amount;
} else {
acc[category] = { name: category, value: 1, total: amount };
}
return acc;
}, {});
console.log(Object.values(groupCategories))
这就是累加器在更改后的样子。如果当前对象category
已存在于累加器中,则增加value
和total
。否则,添加category
as 键和一个新对象作为它的值
{
"Transportation": {
"name": "Transportation",
"value": 1,
"total": 10
},
"Drinks": {
"name": "Drinks",
"value": 1,
"total": 20
},
"Bills": {
"name": "Bills",
"value": 2,
"total": 70
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句