繁体   English   中英

创建一个按日期分组并具有count属性的对象数组

[英]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)) 

您可以使用软件包jinqJS。

有一个groupby子句可能有用

https://jinqjs.readme.io/docs/groupby

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM