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