javascript:在稍后将要评估的函数中设置值

时间:2015-12-23 10:44:22

标签: javascript function eval

抱歉,我不确定如何描述这个问题,这可能使我无法找到答案。

但是从我的代码中可以理解这个问题。

第一件事:代码有效,但我不喜欢我实施的解决方法,所以我想知道你们是否知道更好的方法来实现同样的目标。

我创建了一种辅助函数来处理d3js中的汇总:

function puD3Rollup(data,keys,rollups)
{
  var nested_data = d3.nest();
  for (var k=0;k<keys.length;k++)
  nested_data= eval("nested_data.key(function(d) { return  d["+keys[k]+"];});");
  nested_data= nested_data.rollup(function(leaves) 
  { 
   var ret = {};
   for (var i=0;i<rollups.length;i++)
   {
     if (rollups[i].rollup==__stem.count) ret[rollups[i].name]= leaves.length;
     if (rollups[i].rollup==__stem.sum) ret[rollups[i].name]= d3.sum(leaves, function(d) {return parseFloat(d[rollups.column]);});
     if (rollups[i].rollup==__stem.avg) ret[rollups[i].name]= d3.mean(leaves, function(d) {return parseFloat(d[rollups.column]);});
     if (rollups[i].rollup==__stem.min) ret[rollups[i].name]= d3.min(leaves, function(d) {return parseFloat(d[rollups.column]);});
     if (rollups[i].rollup==__stem.max) ret[rollups[i].name]= d3.max(leaves, function(d) {return parseFloat(d[rollups.column]);});
 }    
 return ret;
 });
 return nested_data.entries(data);  
}

...我这样称呼这个函数(只是一个例子)

puD3Rollup(__team.data,[1],[{rollup:__stem.count,column:3,name:"pscount"}])

这需要:
-a数据数组(__team.data)
- 指定我想按位置1列分组 - 最终将输入列3的汇总(计数)定义为单个列,标签为“pscount”。

问题在于eval部分(我不喜欢)。 通常我会有

nested_data= nested_data.key(function(d) { return  d[keys[k]];});

但是因为我正在定义一个稍后将被评估的函数,所以它将无法获得正确的k值,因此也无法获得键[k]的正确值。 显然,将函数作为文本进行评估,从而使得键[k]成为常量,可以起作用。

但是有更清洁的方法来实现这一目标吗? 我觉得必须有一个我想念的微不足道的解决方案......

谢谢!

1 个答案:

答案 0 :(得分:0)

这里最简单的方法(假设IE9或更高版本或其他浏览器)可能是用for调用替换.forEach循环:

keys.forEach(function(k) {
    nested_data = nested_data.key(function(d) {
        return d[k];
    });
    ...
})

回调的参数k现在在内部.key回调的范围内“绑定”,并在调用时保持正确的值。