簡體   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