D3.js中使用rollup同时处理字符串与数值的技术问题
解决D3.js中d3.nest rollup处理数值与特殊字符串的问题
首先得说你之前的代码问题出在哪:你在rollup函数里错误地引用了全局的dataTotal.Waarde,而不是当前分组里的单个元素,这直接导致你的类型判断完全失效,所以才会返回undefined。另外你的逻辑也没覆盖全场景——既没处理混合数值和"."的情况,也没在全是"."的分支里返回对应的字符串。
根据你的需求,我们需要实现这样的rollup逻辑:如果当前分组里的所有Waarde都是字符串".",就返回".";如果分组里存在数值,就把所有数值求和(忽略".")。下面是修正后的代码:
nested_data = d3.nest() .key(function(d) { return d.SITC; }) .rollup(function(d) { // 检查当前分组的所有Waarde是否都是"." const allAreDot = d.every(function(e) { return e.Waarde === "."; }); if (allAreDot) { return "."; } // 过滤掉".",对有效数值求和 return d3.sum(d, function(e) { return typeof e.Waarde === "number" ? e.Waarde : 0; }); }) .entries(dataTotal);
来拆解下这段代码的逻辑:
- 用
d.every()遍历当前分组的每一项,确认是否所有Waarde都是".",如果是就直接返回字符串"." - 如果分组里有数值,就用
d3.sum()处理:对每个元素判断,是数值就加入求和,是"."就转成0(不影响最终求和结果) - 这样就完美贴合你的需求:全是缺失值的分组保留".",有有效数据的分组返回正确的求和数值
内容的提问来源于stack exchange,提问作者Mart Fijten
相关产品推荐
相关产品推荐

