【问题标题】:Google Visualization group() aggregation function returning nullsGoogle Visualization group() 聚合函数返回空值
【发布时间】:2019-11-14 21:54:47
【问题描述】:

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

.min.maxdocumentation 表示空值被忽略,但我似乎无法返回空值以外的任何内容。

我怎样才能让零进入我的桌子?

谢谢各位专家!

工作示例:

// 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>

【问题讨论】:

    标签: javascript charts google-visualization


    【解决方案1】:

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

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

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

    在自定义 min 函数中,Math.min 将在两个值为 null 时返回零

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

    请参阅以下工作 sn-p...

    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>

    【讨论】:

    • 奇怪的是,谷歌还没有在他们的聚合 API 中这样做。我已将您的建议实施到我的应用程序中。我在您的 sn-p 中添加了 jQuery 引用以使 $.each 工作。再次感谢您,祝您有美好的一天!
    • 谢谢,我想知道为什么它不起作用。它通常给出一个错误,但它没有做任何事情。我以为这只是需要一段时间,我不是那么有耐心......
    【解决方案2】:

    测试了一个最高版本,它也可以工作。这是要分享的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-29
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多