下划线js - indexBy / countBy多个值

时间:2015-12-31 11:42:53

标签: javascript underscore.js

如果我有以下注册表,并希望按日期汇总。

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

2 个答案:

答案 0 :(得分: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 :(得分: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>
&#13;
&#13;
&#13;