最新版D3调用d3.values()报错非函数如何计算属性最值
报错原因
- 你使用的最新版D3(v7及以上版本)已经将
d3.values从核心API中移除,该方法原本属于d3-collection模块,新版本不再默认挂载到d3全局对象,调用时自然会报“values不是函数”的错误。 - 即便是在支持
d3.values的旧版本D3中,该方法也只接收1个待转换的对象参数,不支持传入第二个映射回调,你原来的写法传参逻辑本身也有问题。
正确实现方案
不需要额外引入废弃的d3-collection模块,直接用JS原生Object.values()替代d3.values完成对象到数组的转换即可。另外d3.min/d3.max本身就支持第二个参数作为值访问器,不需要提前对数组做映射处理。
针对你给出的示例数据,计算Property1最小、最大值的代码如下:
const data = { "Item1":{ "Property1": "11", "Property2": "12", }, "Item2":{ "Property1": "21", "Property2": "22", } } // 计算Property1最小值,原属性是字符串格式,用+转成数值 const minVal = d3.min(Object.values(data), d => +d.Property1) // 计算Property1最大值 const maxVal = d3.max(Object.values(data), d => +d.Property1) console.log(minVal, maxVal) // 运行结果:11 21
说明:
Object.values(data)会返回所有一级子对象组成的数组,效果和旧版d3.values(data)完全一致,是ES2017标准的原生API,完全可以满足常规场景的使用需求。
如果需要计算Property2的极值,只需要把访问器函数里的属性名替换成Property2即可。
内容的提问来源于stack exchange,提问作者marco trevi
相关产品推荐
相关产品推荐

