如何在含NaN值的对象数组中正确获取最大prevalence值?
问题原因分析
你得到5而非100的核心原因有两个:
- 字符串字典序比较:你的
prevalence字段都是字符串类型,d3.max(包括原生JS的字符串比较)是按字典序判断大小的。"5"的首字符ASCII码大于"100"的首字符,所以会被判定为更大的值。 - NaN处理不彻底:虽然你用
isNaN判断,但返回的依然是原字符串值,没有转换成数字类型;同时"NaN"字符串只有转成数字后才是真正的NaN,需要排除这类无效值。
解决方案
方案1:修正D3.js代码
只需要在获取prevalence时,先将其转换为数字类型,同时过滤掉无效的NaN值:
var ex = [ {"name": "a", "prevalence": "NaN"}, {"name": "a", "prevalence": "5"}, {"name": "b", "prevalence": "0"}, {"name": "a", "prevalence": "NaN"}, {"name": "c", "prevalence": "100"}, {"name": "c", "prevalence": "20"}, {"name": "a", "prevalence": "3"} ]; // 修正后的d3.max用法 var maxPrevalence = d3.max(ex, function(d) { const num = Number(d.prevalence); // 只返回有效的数字,无效值返回undefined(会被d3.max自动忽略) return isNaN(num) ? undefined : num; }); console.log('maxPrevalence:', maxPrevalence); // 输出100
方案2:纯JavaScript实现
如果不用D3,也可以用原生JS的数组方法组合完成:
方法A:先过滤有效数字,再取最大值
var ex = [/* 你的目标数组 */]; // 提取所有有效的prevalence数字 const validValues = ex .map(item => Number(item.prevalence)) .filter(num => !isNaN(num)); // 取最大值,同时处理空数组的边界情况 const maxPrevalence = validValues.length ? Math.max(...validValues) : undefined; console.log('maxPrevalence:', maxPrevalence); // 输出100
方法B:使用reduce遍历一次完成
var ex = [/* 你的目标数组 */]; const maxPrevalence = ex.reduce((currentMax, item) => { const num = Number(item.prevalence); // 如果当前数字有效且大于当前最大值,就更新最大值 return !isNaN(num) && num > currentMax ? num : currentMax; }, -Infinity); // 初始值设为负无穷,确保第一个有效数字能替换它 console.log('maxPrevalence:', maxPrevalence); // 输出100
内容的提问来源于stack exchange,提问作者user3590729
相关产品推荐
相关产品推荐

