dc.js,动态地填充来自对象的数据表

时间:2016-05-12 02:02:55

标签: javascript d3.js dc.js

我有一个关于用数据填充dc.js表的问题。 The documentation allows for 2 ways for doing this

但是,我的数据被格式化,以便3D数据数组的元素是一个对象。在这个对象中,我存储了一些关于单元格的信息(数据类型,有缺陷,空等)和值(当然)。

因此,我不是通过array[row][column]访问值,而是通过array[row][column].csvValue访问它。

这意味着我无法使用建议的方法来创建设置列的函数。 (见上面的链接)

chart.columns([function(d) { return d.date; }, ... ]);

所以我希望我的数组看起来像是(如果我有3列):

chart.columns([function(d) { return d[0].cellValue; }, 
               function(d) { return d[1].cellValue; },
               function(d) { return d[2].cellValue; } ]);

要动态创建此数组,我遍历每一列并向数组添加一个函数。 这种方法不起作用,因为我在内部函数中有一个变量i,在这个循环之外是未定义的。但我想不出一种构建这个数组的方法,而不需要在我的函数中使用行i的变量。

for (var i = 0; i < cellInfo[0].length; i++) {
    columnArray[i] = function(d) {return d[i].cellValue; /* d[i] produces the error */};
}

我创建了2个jsfiddles:one where you can see my error in the consoleone working example using just a 3D-array without an object inside each cell

1 个答案:

答案 0 :(得分:2)

正如andiwand指出的那样,需要一个闭包来解决我的问题。我还编辑了jsfiddle(通过在函数周围添加括号)。

添加闭包的关键行是:

for (var i = 0; i < data.length; i++) {
    columnArray[i] = (function(i){ return function(d) {return d[i].cellValue;}; })(i);
}

关于这个主题的有趣读物是closure documentation from developers.mozilla.org。它提供了对JS中变量和闭包的范围及其含义的深入了解。