使用Javascript/TypeScript计算总行数
我有以下数组:使用Javascript/TypeScript计算总行数,javascript,arrays,typescript,Javascript,Arrays,Typescript,我有以下数组: [ {category: 'Category 1', data: [ {date: '01/04/2021', value: 10}, {date: '01/03/2021', value: 20}, {date: '01/02/2021', value: 5}] }, {category: 'Category 2', data: [ {date: '01/04/2021', value: 8}, {date: '01/03/2021', value: 2}
[
{category: 'Category 1', data: [ {date: '01/04/2021', value: 10}, {date: '01/03/2021', value: 20}, {date: '01/02/2021', value: 5}] },
{category: 'Category 2', data: [ {date: '01/04/2021', value: 8}, {date: '01/03/2021', value: 2}, {date: '01/02/2021', value: 15}] },
{category: 'Category 3', data: [ {date: '01/04/2021', value: 7}, {date: '01/03/2021', value: 1}, {date: '01/02/2021', value: 5}] }
]
我想添加一个总计行,其中包含类别的每个日期的值之和
例如:
[
{category: 'Category 1', data: [ {date: '01/04/2021', value: 10}, {date: '01/03/2021', value: 20}, {date: '01/02/2021', value: 5}] },
{category: 'Category 2', data: [ {date: '01/04/2021', value: 8}, {date: '01/03/2021', value: 2}, {date: '01/02/2021', value: 15}] },
{category: 'Category 3', data: [ {date: '01/04/2021', value: 7}, {date: '01/03/2021', value: 1}, {date: '01/02/2021', value: 5}] },
{category: 'Total', data: [ {date: '01/04/2021', value: 25}, {date: '01/03/2021', value: 23}, {date: '01/02/2021', value: 30}] }
]
我使用以下代码计算总数:
const totalRow = categories.reduce((acc, curr) => {
if(!acc['data']) {
acc['data'] = [];
}
curr.data.forEach(d => {
if(!acc['data'].find(a => a.date == d.date)) {
acc['data'].push(d);
} else {
let monthData = acc['data'].find(a => a.date == d.date);
monthData.value += d.value;
}
});
return acc;
}, {});
categories.push({category: 'Total', ...totalRow});
但是,总计行仅包含类别1值
我怎样才能解决这个问题?还有,有没有更好的方法来计算总行数?这就是我如何获得所需结果的方法:
const数据=[
{
类别:“类别1”,
数据:[
{日期:'01/04/2021',值:10},
{日期:'01/03/2021',值:20},
{日期:'01/02/2021',值:5},
],
},
{
类别:"类别2",,
数据:[
{日期:'01/04/2021',值:8},
{日期:'01/03/2021',值:2},
{日期:'01/02/2021',值:15},
],
},
{
类别:"类别3",,
数据:[
{日期:'01/04/2021',值:7},
{日期:'01/03/2021',值:1},
{日期:'01/02/2021',值:5},
],
},
];
数据推送(
数据还原(
(res,{data})=>(
data.forEach((d)=>{
res.data.find((r)=>r.date==d.date)
?(res.data.find((r)=>r.date==d.date).value+=d.value)
:res.data.push({…d});
}),
物件
),
{类别:'总计',数据:[]}
)
);
控制台日志(数据)代码>这是我如何获得预期结果的:
const数据=[
{
类别:“类别1”,
数据:[
{日期:'01/04/2021',值:10},
{日期:'01/03/2021',值:20},
{日期:'01/02/2021',值:5},
],
},
{
类别:"类别2",,
数据:[
{日期:'01/04/2021',值:8},
{日期:'01/03/2021',值:2},
{日期:'01/02/2021',值:15},
],
},
{
类别:"类别3",,
数据:[
{日期:'01/04/2021',值:7},
{日期:'01/03/2021',值:1},
{日期:'01/02/2021',值:5},
],
},
];
数据推送(
数据还原(
(res,{data})=>(
data.forEach((d)=>{
res.data.find((r)=>r.date==d.date)
?(res.data.find((r)=>r.date==d.date).value+=d.value)
:res.data.push({…d});
}),
物件
),
{类别:'总计',数据:[]}
)
);
控制台日志(数据)代码>
常量类别=[{
类别:“类别1”,
数据:[{
日期:“2021年4月1日”,
数值:10
}, {
日期:2021年3月1日,
价值:20
}, {
日期:“2021年2月1日”,
价值:5
}]
},
{
类别:"类别2",,
数据:[{
日期:“2021年4月1日”,
数值:8
}, {
日期:2021年3月1日,
价值:2
}, {
日期:“2021年2月1日”,
价值:15
}]
},
{
类别:"类别3",,
数据:[{
日期:“2021年4月1日”,
价值:7
}, {
日期:2021年3月1日,
价值:1
}, {
日期:“2021年2月1日”,
价值:5
}]
}
]
const TOTALLOW=类别。减少((acc,curr)=>{
返回curr.data.map(x=>{
const y=acc.find(i=>i.date==x.date);
返回y{
…x,
值:x.value+y.value
}:x
});
}, []);
类别.推送({
类别:“总计”,
数据:totalRow
});
控制台日志(类别)代码>
常量类别=[{
类别:“类别1”,
数据:[{
日期:“2021年4月1日”,
数值:10
}, {
日期:2021年3月1日,
价值:20
}, {
日期:“2021年2月1日”,
价值:5
}]
},
{
类别:"类别2",,
数据:[{
日期:“2021年4月1日”,
数值:8
}, {
日期:2021年3月1日,
价值:2
}, {
日期:“2021年2月1日”,
价值:15
}]
},
{
类别:"类别3",,
数据:[{
日期:“2021年4月1日”,
价值:7
}, {
日期:2021年3月1日,
价值:1
}, {
日期:“2021年2月1日”,
价值:5
}]
}
]
const TOTALLOW=类别。减少((acc,curr)=>{
返回curr.data.map(x=>{
const y=acc.find(i=>i.date==x.date);
返回y{
…x,
值:x.value+y.value
}:x
});
}, []);
类别.推送({
类别:“总计”,
数据:totalRow
});
控制台日志(类别)代码>这可以通过以下方式完成:
const categories=[
{category:'category 1',数据:[{date:'01/04/2021',value:10},{date:'01/03/2021',value:20},{date:'01/02/2021',value:5}]},
{category:'category 2',数据:[{date:'01/04/2021',value:8},{date:'01/03/2021',value:2},{date:'01/02/2021',value:15}]},
{category:'category 3',数据:[{date:'01/04/2021',value:7},{date:'01/03/2021',value:1},{date:'01/02/2021',value:5}]
];
const totalData=categories.map(o=>o.data)
.flat()
.减少((acc,v)=>{
const existing=acc.find(e=>e.date==v.date);
如果(现有){
现有价值+=v价值;
}否则{
acc.push(JSON.parse(JSON.stringify(v));
}
返回acc;
}, []);
categories.push({category:'Total',data:totalData});
console.log(类别)
这可以按如下方式完成:
const categories=[
{category:'category 1',数据:[{date:'01/04/2021',value:10},{date:'01/03/2021',value:20},{date:'01/02/2021',value:5}]},
{category:'category 2',数据:[{date:'01/04/2021',value:8},{date:'01/03/2021',value:2},{date:'01/02/2021',value:15}]},
{category:'category 3',数据:[{date:'01/04/2021',value:7},{date:'01/03/2021',value:1},{date:'01/02/2021',value:5}]
];
const totalData=categories.map(o=>o.data)
.flat()
.减少((acc,v)=>{
const existing=acc.find(e=>e.date==v.date);
如果(现有){
现有价值+=v价值;
}否则{
acc.push(JSON.parse(JSON.stringify(v));
}
返回acc;
}, []);
categories.push({category:'Total',data:totalData});
console.log(categories)
您可以这样尝试
const data=[{category:'category 1',data:[{date:'01/04/2021',value:10},{date:'01/03/2021',value:20},{date:'01