在Object中定义一个Function,并将变量作为函数的一部分

时间:2017-11-30 15:48:50

标签: javascript google-visualization

我试图在一个对象中定义一个函数,其中一个项目要处理的函数部分基于一个变量。在下面的代码中,如何将*dynamicValue*保存为myColumn的当前值?

  var viewColumns = [0];
  var count = 0;
  var dataCount = 3;
  var total = 0;
  while (count < dataCount) {
    var myColumn = count + 1;
    var viewColumnDescription = {
        calc: function (dt, row) {
          return dt.getValue(row, *dynamicValue*);
        },
        type: "number",
        role: "annotation"
      };
    viewColumns.push(myColumn);
    viewColumns.push(viewColumnDescription);
    count += 1;
  }

请注意,我对dataCount的值进行了硬编码,以便所有变量都在示例部分中定义,但在我的实际代码中,此值当前更改为介于1到3之间的数字。以后可能会更多以及我希望能够使用循环来定义项目。

在这种情况下,生成的对象应该就像我这样做:

viewColumns = [0,
      1, {
        calc: function (dt, row) {
          return dt.getValue(row, 1);
        },
        type: "number",
        role: "annotation"
      },
      2, {
        calc: function (dt, row) {
          return dt.getValue(row, 2);
        },
        type: "number",
        role: "annotation"
      },
      3, {
        calc: function (dt, row) {
          return dt.getValue(row, 3);
        },
        type: "number",
        role: "annotation"
      },
      {
        calc: function (dt, row) {
          return 0;
        },
        label: "Total",
        type: "number",
      },
      {
        calc: function (dt, row) {
          return 'Total: ' + (dt.getValue(row, 1) 
                           + dt.getValue(row, 2) 
                           + dt.getValue(row, 3));
        },
        type: "string",
        role: "annotation"
      }
    ];

如果dataCount为2而不是3,则会删除对dt.getValue(row, 3)的所有引用。希望一旦我知道第一部分,我就可以弄清楚如何让最后一个函数计算所有可用行的总和。

这将用于使用Google Visualization API创建图表。

1 个答案:

答案 0 :(得分:0)

myColumnviewColumnDescriptionvar更改为let。 将*dynamicValue*替换为myColumn

或者如果您不想使用let,则必须使用闭包来确保myColumn的值存储在适当的范围内...

如果你不使用let - 或者你没有把它放在一个闭包中,那么所有viewColumnDescription函数都会看到myColumn值为3

let示例 - 请注意,我只在必要时才使用它。

  var viewColumns = [0];
  var count = 0;
  var dataCount = 3;
  var total = 0;
  while (count < dataCount) {
    let myColumn = count + 1;
    let viewColumnDescription = {
        calc: function (dt, row) {
          return dt.getValue(row, myColumn);
        },
        type: "number",
        role: "annotation"
      };
    viewColumns.push(myColumn);
    viewColumns.push(viewColumnDescription);
    count += 1;
  }