JavaScript如何从对象数组中获取所有数值的最大值
JavaScript对象数组提取所有数值求最大值实现方案
首先注意你的数据源特征:
group字段是分类名称,为非数值内容Nitrogen、normal、stress三个字段存储的是字符串格式的数值,比较前必须先转成数字类型,否则字符串逐位比较ASCII码会出现逻辑错误(比如字符串比较下"9" > "12"会返回true,结果完全错误)
固定字段快速实现
如果你确定只有三个数值字段,直接提取转数字后求最大值即可,代码最简洁:
const data = [ { "group": "banana", "Nitrogen": "12", "normal": "15", "stress": "1" }, { "group": "poacee", "Nitrogen": "6", "normal": "6", "stress": "20" }, { "group": "sorgho", "Nitrogen": "11", "normal": "28", "stress": "12" }, { "group": "triticum", "Nitrogen": "19", "normal": "20", "stress": "12" } ]; const maxValue = Math.max( ...data.flatMap(item => [ Number(item.Nitrogen), Number(item.normal), Number(item.stress) ]) ); console.log(maxValue); // 输出结果28,和示例预期一致
通用适配实现
如果后续可能新增数值字段,不想每次改硬编码的字段名,可以写通用逻辑自动过滤非数值内容:
// 提取所有可转成数字的字段值 const allValidNumbers = data.flatMap(item => Object.values(item) .map(val => Number(val)) .filter(num => !isNaN(num)) // 过滤掉分类名这类转数字后为NaN的内容 ); const maxValue = Math.max(...allValidNumbers);
超大数据量兼容写法
如果你的数据集规模极大(万元素以上),展开运算符传参可能触发栈溢出,可以用reduce遍历逐次比较最大值,性能更稳定:
const maxValue = data.reduce((currentMax, item) => { const currentItemNums = Object.values(item) .map(v => Number(v)) .filter(n => !isNaN(n)); const currentItemMax = Math.max(...currentItemNums); return currentItemMax > currentMax ? currentItemMax : currentMax; }, 0);
内容的提问来源于stack exchange,提问作者Maryam Yumna
相关产品推荐
相关产品推荐

