Javascript 创建按日期分组的具有计数属性的对象数组
因此,我有一个具有以下模式的对象数组:Javascript 创建按日期分组的具有计数属性的对象数组,javascript,arrays,Javascript,Arrays,因此,我有一个具有以下模式的对象数组: { "isOpen" : false, "updatedAt" : "2018-08-23T14:44:31.651+0000" } 我需要将它们转换为一组对象,如下所示: { date: "2018-08-23", added: 1, removed: 2 } 其派生方式是首先按日期将所有对象分组在一起(updatedAtproperty)。然后我将迭代它,查看哪些对象的属性isOpen设置为true,这意味
{
"isOpen" : false,
"updatedAt" : "2018-08-23T14:44:31.651+0000"
}
我需要将它们转换为一组对象,如下所示:
{
date: "2018-08-23",
added: 1,
removed: 2
}
其派生方式是首先按日期将所有对象分组在一起(updatedAt
property)。然后我将迭代它,查看哪些对象的属性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
};
});
我讨厌在数组上重复这么多次。有没有办法让这更有效?也许我可以在一个循环中进行迭代
谢谢 您可以使用jinqJS包 有一个groupby子句,它可能很有用
您可以使用jinqJS软件包 有一个groupby子句,它可能很有用
您可以这样计算循环中的项目。您查找的对象将具有键(日期前缀)和计数,因此无需再次映射
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
您可以像这样计算循环中的项目。您查找的对象将具有键(日期前缀)和计数,因此无需再次映射
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+0000”},{“isOpen{“isOpen”:正确,“更新日期”:“2018-07-23T14:44:31.651+0000”},{“isOpen”:正确,“更新日期”:“2018-08-23T14:44:31.651+0000”}]
让数据=dataArray.reduce((数据,项目)=>{
let key=item.updatedAt.split('T')[0];
让当前=(数据[键]| |(数据[键]={date:key,added:0,removed:0}))
当前[item.isOpen?'added':'removed']+=1
返回数据
}, {});
console.log(Object.values(data))
这似乎是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+0000”},{“isOpenisOpen:正确,“更新日期”:“2018-07-23T14:44:31.651+0000”},{“isOpen”:正确,“更新日期”:“2018-08-23T14:44:31.651+0000”}]
让数据=dataArray.reduce((数据,项目)=>{
let key=item.updatedAt.split('T')[0];
让当前=(数据[键]| |(数据[键]={date:key,added:0,removed:0}))
当前[item.isOpen?'added':'removed']+=1
返回数据
}, {});
console.log(Object.values(data))
我一直使用“如果不在哈希中创建”方法。这是所有groupby实现的工作方式。我一直使用“如果不在哈希中创建”方法。这是所有groupby实现的工作方式。