JS遍历嵌套对象统计firstName出现次数并生成频次排名
JS嵌套对象firstName字段频次统计实现方案
实现逻辑
- 初始化空对象作为计数容器,存储每个姓名对应的出现次数
- 遍历外层对象的所有自有子属性,提取
firstName字段更新计数 - 将计数结果转为数组后按频次降序排序,格式化后输出排名
完整可运行代码
let data = { "1111": { firstName: "john", lastName: "doe", }, "1112": { firstName: "john", lastName: "doe", }, "1113": { firstName: "maria", lastName: "dee", }, "1114": { firstName: "john", lastName: "doe", }, "1115": { firstName: "maria", lastName: "dee", }, "1116": { firstName: "josh", lastName: "kek", }, "1117": { firstName: "maria", lastName: "dee", }, "1118": { firstName: "nick", lastName: "smith" } } // 1. 统计频次 const countMap = {} for (const key in data) { // 过滤原型链属性,只统计对象自身的子项 if (data.hasOwnProperty(key)) { const rawName = data[key].firstName if (!rawName) continue // 统一转小写,避免大小写不同导致统计拆分,可按需去掉 const firstName = rawName.toLowerCase() countMap[firstName] = (countMap[firstName] || 0) + 1 } } // 2. 按频次降序排序,频次相同则按姓名首字母排序,同时格式化首字母大写匹配示例输出 const sortedRank = Object.entries(countMap) .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0])) .map(item => { const name = item[0] return name.charAt(0).toUpperCase() + name.slice(1) }) // 3. 输出排名 sortedRank.forEach((name, index) => { console.log(`${index + 1}. ${name}`) })
输出结果
运行上述代码后控制台输出内容如下,和要求的示例格式完全一致:
1. John 2. Maria 3. Josh 4. Nick
原代码问题说明
- 每次循环都重新声明计数器变量,计数结果无法累积
- 条件判断误写为赋值运算符
=,而非比较运算符=== - 手动声明每个姓名的计数器,无法适配未知的姓名集合,扩展性为0
内容的提问来源于stack exchange,提问作者Tim Schneider
相关产品推荐
相关产品推荐

