You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将对象数组中的投票数量按性别转换为百分比?

问题:将按性别统计的投票数量转换为百分比

我有一个按性别统计投票数量的对象数组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:54:56