Google 可视化 group() 聚合函数返回空值

Google Visualization group() aggregation function returning nulls

我有一个名为 someNumber 的列,其中包含空值和零。将 google.visualization.data.group 应用于此列时,我无法将零传递给 table,只有空值。

.min.maxdocumentation 表示忽略空值,但我似乎无法 return 除了空值。

我怎样才能让零通过我的 table?

谢谢专家!

工作示例:

// Load the Visualization API and the corechart package.
google.charts.load('current', {
  'packages': ['corechart', 'table', 'gauge', 'controls']
});

// Set a callback to run when the Google Visualization API is loaded.
google.charts.setOnLoadCallback(gChart0);

function gChart0() {
  drawChart();
};

function drawChart() {

  var result = [{
    "calendarWeek": "2017-W30",
    "clnCount": 1,
    "someNumber": null //NOTE THIS IS SET TO NULL
  }, {
    "calendarWeek": "2017-W30",
    "clnCount": 3,
    "someNumber": 0 //NOTE THIS IS SET TO ZERO
  }];

  //Create DataTable
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Calendar Week');
  data.addColumn('number', 'Count');
  data.addColumn('number', 'Some Number');
  
  var dataArray = [];
  $.each(result, function(i, obj) {
    dataArray.push([
      obj.calendarWeek,
      obj.clnCount,
      obj.someNumber
    ]);
  });
  data.addRows(dataArray);

  //grouping 
  var groupView = google.visualization.data.group(data,
    [{
      column: 0,
      type: 'string'
    }],
    [{
        column: 1,
        aggregation: google.visualization.data.sum,
        type: 'number'
      },
      {
        column: 2,
        aggregation: google.visualization.data.min,
        type: 'number'
      }
    ]);

  //Options
  var options = {};

  // Instantiate and draw chart, passing in options.
  var chart = new google.visualization.Table(document.getElementById('chart_div'));
  chart.draw(groupView, options);

} //END  function drawChart()
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>

<div id="chart_div"></div>

您可以提供自己的自定义聚合函数。
聚合函数应该接受一个值数组作为唯一的参数。

在自定义求和函数中,我们将null替换为零

function customSum(values) {
  var sum = 0;
  values.forEach(function (value) {
    sum += value || 0;
  });
  return sum;
}

在自定义最小函数中,当两个值都为 null

时,Math.min 将 return 归零
function customMin(values) {
  var min = null;
  values.forEach(function (value) {
    min = Math.min(value, min);
  });
  return min;
}

请参阅以下工作片段...

google.charts.load('current', {
  'packages': ['corechart', 'table', 'gauge', 'controls']
});

// Set a callback to run when the Google Visualization API is loaded.
google.charts.setOnLoadCallback(gChart0);

function gChart0() {
  drawChart();
};

function drawChart() {

  var result = [{
    "calendarWeek": "2017-W30",
    "clnCount": 1,
    "someNumber": null //NOTE THIS IS SET TO NULL
  }, {
    "calendarWeek": "2017-W30",
    "clnCount": 3,
    "someNumber": 0 //NOTE THIS IS SET TO ZERO
  }];

  //Create DataTable
  var data = new google.visualization.DataTable();
  data.addColumn('string', 'Calendar Week');
  data.addColumn('number', 'Count');
  data.addColumn('number', 'Some Number');

  var dataArray = [];
  $.each(result, function(i, obj) {
    dataArray.push([
      obj.calendarWeek,
      obj.clnCount,
      obj.someNumber
    ]);
  });
  data.addRows(dataArray);

  //grouping
  var groupView = google.visualization.data.group(data,
    [{
      column: 0,
      type: 'string'
    }],
    [{
        column: 1,
        aggregation: customSum,
        type: 'number'
      },
      {
        column: 2,
        aggregation: customMin,
        type: 'number'
      }
    ]);

  function customSum(values) {
    var sum = 0;
    values.forEach(function (value) {
      sum += value || 0;
    });
    return sum;
  }

  function customMin(values) {
    var min = null;
    values.forEach(function (value) {
      min = Math.min(value, min);
    });
    return min;
  }

  //Options
  var options = {};

  // Instantiate and draw chart, passing in options.
  var chart = new google.visualization.Table(document.getElementById('chart_div'));
  chart.draw(groupView, options);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>

测试了最大版本,它也可以。这是要分享的代码:

function customMax(values) {
    var max = null;
    values.forEach(function (value) {
        max = Math.max(value, max);
    });
    return max;
}