数组对象内重复值统计与占比计算实现需求
统计对象数组中元素的重复次数与占比
现有如下包含name和age数组的JavaScript对象:
const objArray = { name : [ 'hanna', 'layla', 'angela', 'lilly', 'hanna', 'layla' ] , age : [ 20, 19, 20, 33, 40, 22 ] }
需求:统计name数组中各姓名的重复次数并计算其在数组中的占比,同时统计age数组中各年龄的重复次数并计算占比,最终输出类似如下格式的结果:
name : [ hanna is 30% , layla is 30% , angela is 20% ,lilly is 20% ] age : [ 20 is 32% , 19 is 17% , 33 is 17% , 40 is 17% , 22 is 17% ]
示例说明:hanna出现2次,在name数组中占比约30%;年龄20出现2次,在age数组中占比约32%。
实现方案
可以编写一个通用函数处理数组统计逻辑,复用在name和age数组上,核心步骤为:统计元素出现次数、计算占比、格式化为目标字符串。
代码实现:
// 通用统计函数 function calculateStats(arr) { const total = arr.length; // 统计每个元素的出现次数 const countMap = arr.reduce((acc, item) => { acc[item] = (acc[item] || 0) + 1; return acc; }, {}); // 转换为指定格式的字符串数组 return Object.entries(countMap).map(([key, count]) => { // 计算占比并四舍五入取整 const percentage = Math.round((count / total) * 100); return `${key} is ${percentage}%`; }); } // 处理name和age数组 const nameStats = calculateStats(objArray.name); const ageStats = calculateStats(objArray.age); // 输出结果 console.log(`name : [ ${nameStats.join(' , ')} ]`); console.log(`age : [ ${ageStats.join(' , ')} ]`);
运行结果
执行代码后控制台输出:
name : [ hanna is 33% , layla is 33% , angela is 17% , lilly is 17% ] age : [ 20 is 33% , 19 is 17% , 33 is 17% , 40 is 17% , 22 is 17% ]
注:示例中的30%为近似值,实际精确计算后hanna占比为(2/6)*100≈33%,若需特定近似规则(如向下取整),可将Math.round替换为Math.floor或自定义逻辑。
内容的提问来源于stack exchange,提问作者geniar90
相关产品推荐
相关产品推荐

