Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建按日期分组的具有计数属性的对象数组_Javascript_Arrays - Fatal编程技术网

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实现的工作方式。