You need to enable JavaScript to run this app. JS遍历嵌套对象统计firstName出现次数并生成频次排名
优惠活动
大模型
产品
解决方案
定价
更多

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

原代码问题说明

  1. 每次循环都重新声明计数器变量,计数结果无法累积
  2. 条件判断误写为赋值运算符=,而非比较运算符===
  3. 手动声明每个姓名的计数器,无法适配未知的姓名集合,扩展性为0

内容的提问来源于stack exchange,提问作者Tim Schneider

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:36:05