2016-09-03 43 views
2

我正在玩一個數據集,用於統計某人在某個小時內提交的提交數。我可以一個人做了一個承諾,他們多少次犯下的時間創建一個數組對象:使用下劃線填充數組中缺少的對象

[ { hour: '6', commits: 2 }, 
    { hour: '7', commits: 6 }, 
    { hour: '8', commits: 6 }, 
    { hour: '9', commits: 4 }, 
    { hour: '10', commits: 4 }, 
    { hour: '11', commits: 6 }, 
    { hour: '12', commits: 18 }, 
    { hour: '13', commits: 18 }, 
    { hour: '14', commits: 14 }, 
    { hour: '15', commits: 30 }, 
    { hour: '16', commits: 24 }, 
    { hour: '17', commits: 18 }, 
    { hour: '18', commits: 24 }, 
    { hour: '19', commits: 22 }, 
    { hour: '20', commits: 6 }, 
    { hour: '21', commits: 16 }, 
    { hour: '22', commits: 8 } ] 

如果我堅持試圖填充缺失小時。所以在上面的例子中,我需要包括沒有提交任務的時間。我一整天都在使用0-24範圍。這是我希望得到的結果:

[ 
    { hour: '0', commits: 0 }, 
    { hour: '1', commits: 0 }, 
    { hour: '2', commits: 0 }, 
    { hour: '3', commits: 0 }, 
    { hour: '4', commits: 0 }, 
    { hour: '5', commits: 0 }, 
    { hour: '6', commits: 2 }, 
    { hour: '7', commits: 6 }, 
    { hour: '8', commits: 6 }, 
    { hour: '9', commits: 4 }, 
    { hour: '10', commits: 4 }, 
    { hour: '11', commits: 6 }, 
    { hour: '12', commits: 18 }, 
    { hour: '13', commits: 18 }, 
    { hour: '14', commits: 14 }, 
    { hour: '15', commits: 30 }, 
    { hour: '16', commits: 24 }, 
    { hour: '17', commits: 18 }, 
    { hour: '18', commits: 24 }, 
    { hour: '19', commits: 22 }, 
    { hour: '20', commits: 6 }, 
    { hour: '21', commits: 16 }, 
    { hour: '22', commits: 8 }, 
    { hour: '23', commits: 0 }, 
    { hour: '24', commits: 0 } 
] 

這裏是我用來創建這些對象的功能:

var getAuthorAndHourCounts = (groupedByAuthor) => { 

    var result = _.map(groupByAuthor, (value, key, list) => { 

    var author = key; 
    var hours = _.countBy(value, 'hour'); 

    var commitHourList = []; 

    _.each(hours, (v,k) => { 
     var obj = {}; 
     obj.hour = k; 
     obj.commits = v; 
     commitHourList.push(obj); 
    }); 

    return { 
     person: author, 
     times: commitHourList 
    }; 

    }); 
    return result; 
}; 

如何添加缺失的時代?我正在考慮創建一個列表(0-24),然後查看一個小時是否不在列表中,以便將零值添加到該對象中。不知道如何完成。

+2

只是一個方面說明的最高效的方式:你意識到列表中有25小時,而不是24小時:0小時和24小時之間有什麼區別? – Wh1T3h4Ck5

+0

謝謝你接受。我打算使用24小時。 0將是午夜,1將是上午1點等。 – AldoTheApache

回答

3

如何只初始化commitHourList使得它包含所有小時0提交,然後用實際數據填充它:

// initialize commitHourList with 24 objects 
// one for each hour and each with 0 commits 
var commitHourList = _.range(24).map((hour) => ({ hour, commits: 0 })); 

// for every received hour, add proper commits 
_.each(hours, (commits, hour) => { 
    commitHourList[hour].commits = commits; 
}); 

這樣一來,不管小時就不要添加會自動有0提交。

:使用range然後map初始化數組是更少的代碼,但確實每次迭代陣列的兩倍。更高效的方法是在某個實用程序中創建該陣列一次,然後在每次需要新實用程序時複製該陣列。

例如:

// utility that creates the hours array when initialized 
// and returns a function that will return a copy of the hours array on each call 
var getHoursArray = (function() { 
    var arr = _.range(24).map((hour) => ({ hour, commits: 0 })); 
    return function() { 
    return arr.slice(); 
    } 
})(); 

,然後用它喜歡:

var commitHourList = getHoursArray(); 

使用slice通常是複製一個數組,但here are other possibilities

+1

似乎是合乎邏輯的,它肯定會避免檢查和重新填寫缺失數據 – Wh1T3h4Ck5

+1

非常感謝。我喜歡你用一個函數創建數組並重用它的建議。這解決了我的問題,並幫助我學習新東西! – AldoTheApache

+0

很高興幫助:) – nem035