[英]create an array of objects grouped by date with count properties
所以我有一个具有以下架构的对象数组:
{
"isOpen" : false,
"updatedAt" : "2018-08-23T14:44:31.651+0000"
}
我需要将它们转换成这样的对象数组:
{
date: "2018-08-23",
added: 1,
removed: 2
}
派生方法是首先按日期将所有对象分组在一起( updatedAt
属性)。 然后,我将对其进行迭代,以查看哪些对象的属性isOpen
设置为true
,这意味着它们是在当天添加的,如果为false
,则在当天将其删除。
有点像这样:
var data = {};
dataArray.forEach(function (item) {
var key = item.updatedAt.split('T')[0];
if(data.hasOwnProperty(key)){
if(item.isOpen) data[key].added = data[key].added + 1;
else data[key].removed = data[key].removed + 1;
} else {
if(item.isOpen) data[key] = {added: 1, removed: 0};
else data[key] = {added: 0, removed: 1};
}
});
var final = Object.keys(data).map(function (key) {
return {
date: key,
added: data[key].added,
removed: data[key].removed
};
});
我讨厌遍历数组很多次。 有没有办法使它更有效? 也许我可以以某种方式在一个循环中进行迭代。
谢谢!
您可以像这样在循环中计算项目。 您要查找的对象将具有键(日期前缀)和计数,因此您无需第二次映射。
var ret = {}
dataArray.forEach(function(item) {
var date = item.updatedAt.split('T')[0];
let counts = ret[date]
if (!counts) {
counts = {
date,
added: 0,
removed: 0
}
ret[date] = counts
}
if (item.isOpen) counts.added++
else counts.removed++;
})
var output = ret.values
看起来好像很好地使用了reduce
,它将减少一些代码。 然后,只需在创建哈希图时添加日期即可。 如果这样做,则最终数组将在Object.values()
的结果中等待:
let dataArray = [{"isOpen" : false, "updatedAt" : "2018-08-23T14:44:31.651+0000"},{"isOpen" : true, "updatedAt" : "2018-08-23T14:44:31.651+0000"},{"isOpen" : true, "updatedAt" : "2018-08-23T14:44:31.651+0000"},{"isOpen" : false, "updatedAt" : "2018-07-23T14:44:31.651+0000"},{"isOpen" : false, "updatedAt" : "2018-07-23T14:44:31.651+0000"},{"isOpen" : true, "updatedAt" : "2018-07-23T14:44:31.651+0000"},{"isOpen" : true, "updatedAt" : "2018-08-23T14:44:31.651+0000"}] let data = dataArray.reduce((data, item) => { let key = item.updatedAt.split('T')[0]; let current = (data[key] || (data[key] = {date: key, added: 0, removed: 0})) current[item.isOpen ? 'added' : 'removed'] += 1 return data }, {}); console.log(Object.values(data))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.