d3.max()读取CSV数据计算最大值为何返回第二大数值?
问题原因
d3的csv()方法加载解析CSV文件时,默认会将所有字段的值解析为字符串类型,不会自动转换为数值。
你在代码中直接传入d.value给max()方法计算最大值时,实际执行的是字符串字典序比较,而非数值大小比较:
- 字符串比较会逐位对比字符的ASCII编码:"850"的首字符是
'8'(ASCII码56),"1000"的首字符是'1'(ASCII码49),对比第一位字符就会判定"850"更大,因此最终返回结果为850,和数值层面的预期最大值1000不符。
修复方案
你可以任选以下一种方式修复:
- 计算最大值时手动将值转为数值类型,修改
max调用逻辑即可:
let top = max(data, d => +d.value); // 也可以写为 d => Number(d.value),效果一致
- 在CSV加载阶段就通过行转换函数完成类型转换,后续使用字段时不需要重复转类型:
csv(filepath, d => { d.value = +d.value; return d; }).then(data => { let top = max(data, d => d.value); console.log(top) // 此时会正确输出数值最大值1000 render(data) });
内容的提问来源于stack exchange,提问作者jesvtb
相关产品推荐
相关产品推荐

