pro google examples chart arraytodatatable javascript loops charts google-visualization

javascript - examples - sp google chart



Bucle de JavaScript hace referencia al último número en bucle (1)

Para cuando llame a sus métodos de cálculo, el ciclo ya habrá finalizado y todas las funciones de cálculo mantendrán una referencia a (el mismo) x e idx en su último estado. Necesita introducir otra función / alcance para poder "congelar" cada idx particular. La forma (sintácticamente) más simple es crear una función separada que toma idx como argumento y devuelve otra función.

function createCalcFunction(idx) { return function (dt, row) { /* make a local copy */ var localIdx = parseInt(idx, 10); console.log("row: ", row, "Idx: ",localIdx); var val = dt.getValue(0, localIdx); for (var i = 1, total = 0, cols = dt.getNumberOfColumns(); i < cols; i++) { total += dt.getValue(row, i); } var percent = val / total; return {v: percent, f: (percent * 100).toFixed(2) + ''%''}; // return value and value } } var cols = []; for (var x = 1; x < data.H.length + 1; x++) { var idx = x - 1; console.log(idx); cols.push({ type: ''number'', label: data.getColumnLabel(idx), calc: createCalcFunction(idx); }); }; view.setColumns(cols);

Trabajando con la biblioteca de visualización de google, sin embargo, no creo que eso importe aquí.

Tengo una variable llamada data.H with tiene una longitud de 5

Quiero ver eso aquí:

var cols = new Array(); for (var x = 1; x < data.H.length + 1; x++) { var idx = x - 1; console.log(idx); cols.push({ type: ''number'', label: data.getColumnLabel(idx), calc: function (dt, row) { console.log("row: ", row, "Idx: ",idx); var val = dt.getValue(0, idx); // this is always 5 for (var i = 1, total = 0, cols = dt.getNumberOfColumns(); i < cols; i++) { total += dt.getValue(row, i); } var percent = val / total; return {v: percent, f: (percent * 100).toFixed(2) + ''%''}; // return value and value } }); }; view.setColumns(cols);

El problema es que mi método de cálculo necesita hacer referencia a idx . Sin embargo, idx siempre es 5. Debería ser 1,2,3,4 y 5 en cada ciclo.

¿Que esta pasando aqui? ¿Cómo hago que la función calc haga referencia al número en el momento del ciclo?