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

javascript : setting values in a function that will be evaluated later

本文关键字:函数 设置 评估 javascript      更新时间:2023-09-26

对不起,我真的不知道如何描述这个问题,这可能也让我找不到答案。

但从我的代码来看,这个问题应该是可以理解的。

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

我创建了一种助手函数来处理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"}])

这需要:
-数据数组(__team.data)
-指定要在位置1按列分组
-最后将一列定义为输出,该列是输入列3的汇总(计数),标签为"pscount"。

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

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

但由于我正在定义一个稍后将要评估的函数,它将无法获得k的正确值,因此也无法获得keys[k]的正确值。显然,将函数求值为文本,从而使keys[k]为常量,是可行的。

但是,有没有一种更清洁的方式来实现这一点?我有一种感觉,一定有一个琐碎的解决方案我错过了。。。

谢谢!

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

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

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