JavaScript闭包:在对象中动态存储组失败

javascript closures : fails with dynamicly storing groups in object

本文关键字:动态 存储 失败 对象 闭包 JavaScript      更新时间:2023-09-26

我有一个 dc.js 程序,当我为 dc 组提供单独的名称时,该程序运行良好

var group1 = dateDimension.group().reduceSum(function(d) { return d.dd; });
var group2 = dateDimension.group().reduceSum(function(d) { return d.count; });

但是当我这样做时

    var groups = {};
    var columns   = ["dd","count"];
    for (var i = 0; i < columns.length; ++i) {
        var col = columns[i]
        groups[col] = dateDimension.group().reduceSum(function(d) { return d[col]; });
    }

它只记住最后一列,并用最后一个图表替换其他图表。

我应该如何解决这个问题

这里的问题是JavaScript中一直出现的问题。您的变量"col"的作用域为该for循环所在的函数,因此它由传递到"reduceSum()"函数的两个匿名函数共享。

解决方案是插入另一个函数以提供列名的不同副本。 (此外,不应使用 for ... in 循环访问数组。

for (var i = 0; i < columns.length; ++i) {
  (function( columnName ) {
    group[ columnName ] = dateDimension.group().reduceSum(function(d) { return d[columnName]; });
  })( columns[i] );
}