如何对数组对象的字段值做比例计算并重组结构?
解决方案
核心思路
先提取目标字段(carry、distance)的最大值,再遍历原数组,按「(当前值/最大值)*100」的公式计算百分比评分,最后将评分字段追加到原对象中。
完整代码实现
const data = [ { id: 1, direction: "A", carry: 6, distance: 1.41 }, { id: 2, direction: "B", carry: 5, distance: 2.83 }, { id: 3, direction: "C", carry: 4, distance: 4.24 }, { id: 4, direction: "D", carry: 3, distance: 5.66 }, ]; // 1. 提取目标字段的最大值 const maxCarry = Math.max(...data.map(item => item.carry)); const maxDistance = Math.max(...data.map(item => item.distance)); // 2. 遍历数组,计算评分并生成新数据 const result = data.map(item => ({ ...item, carry_rating: Math.round((item.carry / maxCarry) * 100), distance_rating: Math.round((item.distance / maxDistance) * 100) })); console.log(result);
代码说明
提取最大值:
- 使用
data.map(item => item.carry)提取所有carry值,通过扩展运算符...传入Math.max得到最大值,distance字段同理。 - 这一步比
sort更高效,sort需要排序整个数组,而直接提取最大值只需一次遍历。
- 使用
生成新数组:
- 使用
map遍历原数组,通过对象扩展运算符...item保留原字段。 - 用
Math.round对百分比结果取整,和示例中的数值匹配(比如5/6≈83.33→84,4/6≈66.67→67)。
- 使用
为什么之前的filter/sort没成功?
filter是用来筛选数组元素的,无法直接计算最大值或生成新字段;sort只能排序数组,要获取最大值还需额外取排序后的首尾元素,且排序会改变原数组顺序(除非深拷贝),不如直接提取最大值高效。
内容的提问来源于stack exchange,提问作者83hru2
相关产品推荐
相关产品推荐

