下划线 js - indexBy / countBy 多个值

underscore js - indexBy / countBy multiple values

如果我有以下寄存器并想按日期汇总它。

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 来完成,但不太确定!

只需使用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;
}, {});

不用下划线也可以实现

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>