如何将对象数组中的投票数量按性别转换为百分比?
问题:将按性别统计的投票数量转换为百分比
我有一个按性别统计投票数量的对象数组genderResults,希望将其中的Qty(数量)转换为按性别划分的Percentage(百分比)。
原始数组如下:
const genderResults = [ { Qty: 7, Gender: 'Male', Answer: 'Badminton' }, { Qty: 8, Gender: 'Female', Answer: 'Badminton' }, { Qty: 2, Gender: 'Male', Answer: 'None of the above' }, { Qty: 2, Gender: 'Female', Answer: 'None of the above' }, { Qty: 3, Gender: 'Female', Answer: 'Rugby' }, { Qty: 5, Gender: 'Male', Answer: 'Rugby' }, { Qty: 4, Gender: 'Male', Answer: 'Soccer' }, { Qty: 3, Gender: 'Female', Answer: 'Soccer' }, { Qty: 21, Gender: 'Male', Answer: 'Squash' }, { Qty: 16, Gender: 'Female', Answer: 'Squash' }, { Qty: 1, Gender: 'Other', Answer: 'Squash' }, { Qty: 18, Gender: 'Female', Answer: 'Tennis' }, { Qty: 12, Gender: 'Male', Answer: 'Tennis' } ];
期望得到的结果示例:
const result = [ { Percentage: 47, Gender: 'Male', Answer: 'Badminton' }, { Percentage: 53, Gender: 'Female', Answer: 'Badminton' }, { Percentage: 50, Gender: 'Male', Answer: 'None of the above' }, { Percentage: 50, Gender: 'Female', Answer: 'None of the above' }, { Percentage: 63, Gender: 'Male', Answer: 'Rugby' }, { Percentage: 37, Gender: 'Female', Answer: 'Rugby' }, // 其余项按相同逻辑转换 ];
我尝试过forEach循环和array.map方法,但不知道如何对结果进行分组。
解决方案
核心思路是先按Answer分组计算每个选项的总票数,再用单个性别的票数除以对应选项的总票数,得到百分比后替换原有的Qty字段。
1. 统计每个Answer的总票数
用一个对象存储每个投票选项的总票数,遍历一次数组即可完成统计:
const totalByAnswer = {}; genderResults.forEach(item => { const answer = item.Answer; totalByAnswer[answer] = (totalByAnswer[answer] || 0) + item.Qty; });
执行后会得到每个选项的总票数,比如:
{ Badminton: 15, 'None of the above': 4, Rugby: 8, Soccer: 7, Squash: 38, Tennis: 30 }
2. 转换为百分比数组
用map遍历原始数组,将每个对象的Qty替换为计算后的百分比,最后取整:
const percentageResults = genderResults.map(item => { const total = totalByAnswer[item.Answer]; const percentage = Math.round((item.Qty / total) * 100); return { Percentage: percentage, Gender: item.Gender, Answer: item.Answer }; });
完整代码
整合两步的完整实现:
const genderResults = [ { Qty: 7, Gender: 'Male', Answer: 'Badminton' }, { Qty: 8, Gender: 'Female', Answer: 'Badminton' }, { Qty: 2, Gender: 'Male', Answer: 'None of the above' }, { Qty: 2, Gender: 'Female', Answer: 'None of the above' }, { Qty: 3, Gender: 'Female', Answer: 'Rugby' }, { Qty: 5, Gender: 'Male', Answer: 'Rugby' }, { Qty: 4, Gender: 'Male', Answer: 'Soccer' }, { Qty: 3, Gender: 'Female', Answer: 'Soccer' }, { Qty: 21, Gender: 'Male', Answer: 'Squash' }, { Qty: 16, Gender: 'Female', Answer: 'Squash' }, { Qty: 1, Gender: 'Other', Answer: 'Squash' }, { Qty: 18, Gender: 'Female', Answer: 'Tennis' }, { Qty: 12, Gender: 'Male', Answer: 'Tennis' } ]; // 统计每个选项的总票数 const totalByAnswer = {}; genderResults.forEach(item => { totalByAnswer[item.Answer] = (totalByAnswer[item.Answer] || 0) + item.Qty; }); // 转换为百分比数组 const percentageResults = genderResults.map(item => ({ Percentage: Math.round((item.Qty / totalByAnswer[item.Answer]) * 100), Gender: item.Gender, Answer: item.Answer })); console.log(percentageResults);
内容的提问来源于Stack Exchange,提问作者Glen B
相关产品推荐
相关产品推荐

