按公共属性(日期)汇总对象数组



嗨,我正在做一个有角度的项目。

目前我有一个名为historyArr的数组。它有一些2天的统计数据如下。

[
{
"dateRange": "2020-07-01T16:00:00.000+0000",
"total": 20,
"delivered": 5,
"undeliverable": 5,
"expired": 5,
"enroute": 5
},
{
"dateRange": "2020-07-01T17:00:00.000+0000",
"total": 50,
"delivered": 10,
"undeliverable": 15,
"expired": 10,
"enroute": 15
},
{
"dateRange": "2020-07-01T18:00:00.000+0000",
"total": 8,
"delivered": 2,
"undeliverable": 2,
"expired": 2,
"enroute": 2
},
{
"dateRange": "2020-07-02T00:00:00.000+0000",
"total": 160,
"delivered": 40,
"undeliverable": 40,
"expired": 40,
"enroute": 40
},
{
"dateRange": "2020-07-02T01:00:00.000+0000",
"total": 200,
"delivered": 50,
"undeliverable": 50,
"expired": 50,
"enroute": 50
}
]

我想减少上面的数组,这样我就可以每天执行统计数据的总和。所以我想把上面的数组转换成下面的数组。我是一个免费使用moment.js库来解析日期的人。

[
{
"dateRange": "2020-07-01",
"total": 78,
"delivered": 17,
"undeliverable": 22,
"expired": 17,
"enroute": 22
},
{
"dateRange": "2020-07-02",
"total": 360,
"delivered": 90,
"undeliverable": 90,
"expired": 90,
"enroute": 900
}
] 

我知道这是个难题。该项目以stackblitz 上传

https://stackblitz.com/edit/angular-zqmdpy

https://angular-zqmdpy.stackblitz.io

https://stackblitz.com/edit/angular-zqmdpy?embed=1&file=src/app/app.component.html

非常感谢任何帮助谢谢

您可以

  • 执行String.prototype.slice()以获得dateRange的有意义部分,并将其用作密钥
  • 遍历源阵列(例如使用Array.prototype.reduce()(
  • 并且建立具有分组/汇总的对象作为相应值的CCD_ 4
  • 然后用CCD_ 5将这些值提取到数组中
  • 假设除dateRange之外的所有属性都应该进行汇总 ,您可以使用轻微的快捷方式不显式硬编码所有属性:

const src = [{"dateRange":"2020-07-01T16:00:00.000+0000","total":20,"delivered":5,"undeliverable":5,"expired":5,"enroute":5},{"dateRange":"2020-07-01T17:00:00.000+0000","total":50,"delivered":10,"undeliverable":15,"expired":10,"enroute":15},{"dateRange":"2020-07-01T18:00:00.000+0000","total":8,"delivered":2,"undeliverable":2,"expired":2,"enroute":2},{"dateRange":"2020-07-02T00:00:00.000+0000","total":160,"delivered":40,"undeliverable":40,"expired":40,"enroute":40},{"dateRange":"2020-07-02T01:00:00.000+0000","total":200,"delivered":50,"undeliverable":50,"expired":50,"enroute":50}],
result = [...src
.reduce((acc, o) => {
const key = o.dateRange.slice(0,10),
group = acc.get(key)
if(group){
const { dateRange, ...rest } = o
Object
.keys(rest)
.forEach(key => 
group[key] = (group[key] || 0) + (o[key] || 0))
} else {
acc.set(key, {...o, dateRange: key})
}          
return acc
}, new Map)
.values()
]

console.log(result)
.as-console-wrapper{min-height:100%;}

这是一个你应该怎么做的想法,我根本不在乎日期的正确格式,你应该改进它,我创建了一个不会变异的辅助arr,以便不更改原始数组。

ngOnInit() {
var temp = {};
var obj = null;

this.arr = data;
this.historyArr = this.arr['histogramDistributionbyCdrStatuses']; 
this.historyArr.forEach(el=>{
el.dateRange=moment(el.dateRange).format('YYYY-MM-DD')
})
let auxArr = JSON.parse(JSON.stringify(this.historyArr));
for(var i=0; i < auxArr.length; i++) {
obj=auxArr[i];
if(!temp[obj.dateRange]) {
temp[obj.dateRange] = obj;
} else {
temp[obj.dateRange].total += obj.total;
}
}
var result = [];
for (var prop in temp)
result.push(temp[prop]);
console.log(result)

}

我遍历数组并从条目中获取日期。我查看这个日期是否在帮助数组索引中。如果不是,我将使用条目中的属性创建一个新条目,并将其附加到结果中。否则,我会在结果数组中查找此索引,并将元素的每一个属性加和到此条目。

function transformArray( array ) {
let result = [];
let index = [];
array.forEach(obj => {
const  PROPERTIES = Object.keys(obj);
PROPERTIES.splice(PROPERTIES.indexOf('dateRange'),1);
let dat = obj.dateRange.substr(0,10);
let resIndex = index.indexOf(dat);
if ( resIndex == -1) {
index.push(dat);
let entry = { dateRange: dat}
PROPERTIES.forEach (prop => entry[prop] = obj[prop] || 0);
result.push(entry);
} else {
let entry = result[resIndex];
PROPERTIES.forEach (prop => entry[prop] = (entry[prop] || 0) + (obj[prop] || 0));
}
});
return result;
}
let historyArr = [
{
"dateRange": "2020-07-01T16:00:00.000+0000",
"total": 20,
"delivered": 5,
"undeliverable": 5,
"expired": 5,
"enroute": 5
},
{
"dateRange": "2020-07-01T17:00:00.000+0000",
"total": 50,
"delivered": 10,
"undeliverable": 15,
"expired": 10,
"enroute": 15
},
{
"dateRange": "2020-07-01T18:00:00.000+0000",
"total": 8,
"delivered": 2,
"undeliverable": 2,
"expired": 2,
"enroute": 2
},
{
"dateRange": "2020-07-02T00:00:00.000+0000",
"total": 160,
"delivered": 40,
"undeliverable": 40,
"expired": 40,
"enroute": 40
},
{
"dateRange": "2020-07-02T01:00:00.000+0000",
"total": 200,
"delivered": 50,
"undeliverable": 50,
"expired": 50,
"enroute": 50
}
];
console.log(transformArray(historyArr));

最新更新