Dynamic google折线图的动态透视数据

Dynamic google折线图的动态透视数据,dynamic,google-visualization,pivot,linechart,dataview,Dynamic,Google Visualization,Pivot,Linechart,Dataview,我想在同一个折线图中显示各个国家历年的“人口”。显示的数据基于多选下拉列表“国家”中的选择。基础数据表有3列: 年份、国家、人口 2012年,countryA,33 2013年,countryA,35岁 2014年,countryA,40 2012年,countryB,65 2013年,countryB,70 2014年,countryB,75 2012年,countryC,15 2013年,countryC,20 2014年,countryC,25 我正在尝试从基础数据表创建数据透视视图 我使

我想在同一个折线图中显示各个国家历年的“人口”。显示的数据基于多选下拉列表“国家”中的选择。基础数据表有3列:

年份、国家、人口
2012年,countryA,33
2013年,countryA,35岁
2014年,countryA,40
2012年,countryB,65
2013年,countryB,70
2014年,countryB,75
2012年,countryC,15
2013年,countryC,20
2014年,countryC,25

我正在尝试从基础数据表创建数据透视视图 我使用的代码是:

  function drawLineChart() {

      var arr = $('#country').val();

      var lineChartJson = $.ajax({
      url: "../json/lineChart.json",
      dataType: "json",
      async: false
      }).responseText;

    var lineChartData = new google.visualization.DataTable(lineChartJson);
    var view = new google.visualization.DataView(lineChartData);

    var viewCols = [0];

    for(var i = 0; i < arr.length; i++) {

           var viewCols1 = [{
                type: 'number',
                label: arr[i],
                calc: function (dt, row) {
                    return (dt.getValue(row, 1) == arr[i]) ? dt.getValue(row, 2) : null;
                        }
                    }];

                    viewCols = viewCols.concat(viewCols1);

            }

 view.setColumns(viewCols);

var aggCols = [{
                    column: 1,
                    type: 'number',
                    label: view.getColumnLabel(1),
                    aggregation: google.visualization.data.sum
                }];

    for(var i = 2; i < 4; i++) {

            var aggCols1 = [{
                    column: i,
                    type: 'number',
                    label: view.getColumnLabel(i),
                    aggregation: google.visualization.data.sum
                }];

            aggCols = aggCols.concat(aggCols1);
        }

    var pivotedData = google.visualization.data.group(view, [0], aggCols);
循环中出了什么问题?我正在创建视图列的循环中的“concat”是否有问题?我还使用console.log看到了viewCols数组,它似乎有正确的元素

我试着跟随下面的帖子:
问题与范围有关

arr[i]
calc:function(dt,row)

这里是另一种数据透视方法

google.charts.load('current'{
回调:函数(){
var arr=[
“countryA”,
“countryB”,
“countryC”
];
var lineChartData=google.visualization.arrayToDataTable([
[“年”、“国家”、“人口”],
[2012,'countryA',33],
[2013,'countryA',35],
[2014,'countryA',40],
[2012,'countryB',65],
[2013,'countryB',70],
[2014,'countryB',75],
[2012,'countryC',15],
[2013,'countryC',20],
[2014,'countryC',25]
]);
//按年排序
sort([{column:0}]);
//获得独特的国家
var countryGroup=google.visualization.data.group(
线形图数据,
[1]
);
//建立国家数据表
var countryData=new google.visualization.DataTable({
科尔斯:[
{标签:'Year',类型:'number'},
]
});
//为每个国家/地区添加列
对于(var i=0;i

我可以用上面的代码找出问题所在

“calc”是循环中的回调函数。因此,只有循环变量“i”的最后一个值在循环中可见

放置包装器函数可以修复它:

  for(var i = 0; i <= arr.length; i++)(function(i) {
           var viewCols1 = [{
                type: 'number',
                label: arr[i],
                calc: function (dt, row) {
                    return (dt.getValue(row, 1) == arr[i]) ? dt.getValue(row, 2) : null;
                        }
                    }];
        viewCols = viewCols.concat(viewCols1);  
            })(i);

for(var i=0;我非常感谢@WhiteHat的回复。我将尝试使用您的代码,但我在calc函数的工作代码中使用了arr[0]、arr[1]和arr[2]?在这种情况下,引用不会保存到
i
  for(var i = 0; i <= arr.length; i++)(function(i) {
           var viewCols1 = [{
                type: 'number',
                label: arr[i],
                calc: function (dt, row) {
                    return (dt.getValue(row, 1) == arr[i]) ? dt.getValue(row, 2) : null;
                        }
                    }];
        viewCols = viewCols.concat(viewCols1);  
            })(i);