2015-12-31 35 views
2

如果我有以下的寄存器,並希望按日期來概括它。強調JS - indexBy/countBy多個值

var register = [ 
{date: '24/12/2015', present: 'P'}, 
{date: '24/12/2015', present: 'A'}, 
{date: '24/12/2015', present: 'P'}, 
{date: '25/12/2015', present: 'P'}, 
{date: '25/12/2015', present: 'P'}]; 

我正在尋找的結果是類似下面(不必是正是這種格式,所以只要我能以某種形式獲得的彙總數據 - 多維數組或對象數組是罰款) 。最終我希望能夠使用chart.js來顯示出席日期。

'24/12/2015': {P: 2, A: 1}, 
'25/12/2015': {P: 2, A: 0} 

上面的數字是每個給定日期的'P'和'A'的計數。

我不知道如何做到這一點使用下劃線JS - 我認爲它可以使用indexBy和countBy,但真的不知道做!

回答

3

只需使用reduce功能

register.reduce(function(memo, item){ 
    if(!memo.hasOwnProperty(item.date)){ 
    memo[item.date] = { P:0, A:0 }; 
    }  
    memo[item.date][item.present]++; 
    return memo; 
}, {}); 
1

這是可以實現的,而不強調

var register = [ 
 
{date: '24/12/2015', present: 'P'}, 
 
{date: '24/12/2015', present: 'A'}, 
 
{date: '24/12/2015', present: 'P'}, 
 
{date: '25/12/2015', present: 'P'}, 
 
{date: '25/12/2015', present: 'P'}]; 
 

 
var counted = register.reduce(function(sum, item) { 
 
    var date = item.date; 
 
    var present = item.present; 
 

 
    if (sum[date]) { 
 
    if (sum[date][present]) { 
 
     sum[date][present] = sum[date][present] + 1; 
 
    } else { 
 
     sum[date][present] = 1; 
 
    } 
 
    } else { 
 
    sum[date] = {}; 
 
    sum[date][present] = 1; 
 
    } 
 
    return sum; 
 
}, {}) 
 

 
snippet.log(counted)
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>