
在处理复杂的J*aScript数据时,我们经常会遇到包含多层嵌套对象和数组的结构。例如,一个主对象可能包含学生列表(数组),每个学生对象又包含课程列表(数组)。我们的目标是编写一个函数,能够遍历这样的结构,并准确统计其中所有对象和数组的总数量。
考虑以下示例数据结构:
let datas = {
name:"Main datas list",
content:"List of Students and teachers",
students:[
{
name:"John",
age:23,
courses:["Mathematics","Computer sciences","Statistics"]
},
{
name:"William",
age:22,
courses:["Mathematics","Computer sciences","Statistics","Algorithms"]
}
],
teachers:[
{
name:"Terry",
courses:["Mathematics","Physics"],
}
]
};这个datas对象包含:
总计需要统计的对象和数组数量为:1 (datas) + 1 (students) + 2 (student objects) + 2 (student courses arrays) + 1 (teachers) + 1 (teacher object) + 1 (teacher courses array) = 9。
为了解决这类嵌套结构的遍历和统计问题,递归是一种非常有效的编程范式。下面是一个用于统计并显示对象和数组的递归函数实现:
function countAndDisplay(obj, indent = "") {
let count = 0; // 初始化当前层级的计数器
for (let key in obj) {
// 排除原型链上的属性
if (!obj.hasOwnProperty(key)) {
continue;
}
// 如果属性不是对象(包括null,但typeof null === 'object',需要额外处理)
if (typeof obj[key] !== "object" || obj[key] === null) {
console.log(`${indent}${key} : ${obj[key]}`);
} else { // 如果属性是对象或数组
if (Array.isArray(obj[key])) {
console.log(`${indent}Array : ${key} contains ${obj[key].length} element(s)`);
} else { // 纯对象
console.log(`${indent}Object : ${key} contains ${Object.keys(obj[key]).length} element(s)`);
}
// 1. 统计当前层级遇到的对象或数组
count++;
// 2. 递归调用并累加子层级的计数
count += countAndDisplay(obj[key], indent + " ");
// 调试输出,帮助理解计数过程
console.log(`${indent}=> DEBUG TEST COUNT VALUE = ${count} (after processing ${key})`);
}
}
return count; // 返回当前层级及其子层级的总计数
}
let totalCount = countAndDisplay(datas);
console.log(`\ndatas contains ${totalCount} Objects or Arrays`);核心逻辑分解:
初始化计数器 count = 0: 在每次调用 countAndDisplay 函数时,都会创建一个新的局部变量 count,用于统计当前函数调用所处理的对象层级及其所有子层级中的对象和数组数量。
遍历属性: for (let key in obj) 循环遍历当前对象的每一个属性。obj.hasOwnProperty(key) 用于确保只处理对象自身的属性,而不是原型链上的属性。
非对象处理: 如果 obj[key] 不是一个对象(或为 null),则直接打印其键值对。这构成了递归的“基线条件”之一,即当遇到非对象类型时,递归停止深入。
Facetune
一款在线照片和视频编辑工具,允许用户创建AI头像
109
查看详情
对象/数组处理:
返回 count: 当 for 循环结束时,当前 countAndDisplay 函数调用已经遍历了其传入对象的所有属性,并累加了所有子层级的计数。最终,它将这个累加后的 count 值返回给其调用者。
问题中特别指出对 count += the_same_function() 这一行的困惑。理解它的关键在于:
为什么不能只调用 countAndDisplay(obj[key], indent + " ")?
如果仅仅写成 countAndDisplay(obj[key], indent + " ") 而不使用 +=,那么递归函数虽然会执行,并可能在控制台打印信息,但它返回的计数结果将被丢弃。当前层级的 count 变量将无法获取到子层级的统计信息,导致最终返回的总数不正确(它只会包含最外层直接的子对象/数组,而不会包含深层嵌套的)。
简而言之,count += countAndDisplay(...) 模式是递归函数用于聚合其子任务结果的典型方式。每个递归调用负责计算其“管辖范围”内的计数,并通过 return 语句将结果传递给上层调用者,上层调用者再通过 += 将这些结果汇集起来。
通过理解这种递归与累加的模式,开发者可以更有效地处理复杂的嵌套数据结构,实现强大的数据分析和转换功能。
以上就是J*aScript深度递归:高效统计复杂嵌套结构中的对象与数组的详细内容,更多请关注其它相关文章!
# 返回值
# 想转行做seo
# 手机银行app营销推广
# 武夷山网络seo优化
# 成都专业的seo关键词排名
# 益阳网站建设在线咨询
# 扬州推广网站方案
# 什么叫做seo 网站
# 老牌网站建设公司
# 互联网如何做营销推广
# 中国模板网站建设平台
# 而不
# 将其
# 运算符
# javascript
# 象中
# 键值
# 是一个
# 数据结构
# 遍历
# 递归
# 为什么
# 键值对
# 递归函数
# ai
# go
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
谷歌浏览器怎么把网页翻译成中文_Chrome网页翻译功能使用方法
获取WooCommerce产品在后台编辑页面的分类ID
追剧达人如何发弹幕
MySQL多重JOIN技巧:高效关联同一表获取多角色信息
路由器DNS怎么设置最快 优化DNS提升上网速度教程
Python对象引用与属性赋值:理解链表中的行为
店铺如何做视频号推广?做视频号推广有用吗?
抖音评论无法发送如何修复 抖音评论功能操作指南
使用Google服务账号实现Google Drive API无缝集成与文件访问
PSD转AI文件的简单方法
猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程
CSS如何使用outline-offset与颜色组合突出元素边框
《大润发优鲜》充值方法介绍
mysql数据库索引类型有哪些_mysql索引类型解析
FotoBalloon图片左右镜像教程
外卖小程序对接第三方配送
抖音号升级成企业资质怎么弄?有什么好处?
j*a中ArrayBlockingQueue的使用
《深林》冬季章节图文攻略
解决CSS容器溢出问题:使用calc()实现精确布局与边距控制
word怎么将图片设置为页面背景并不影响打印_Word图片背景设置方法
TikTok视频播放不流畅怎么办 TikTok视频播放优化方法
苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法
抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?
163邮箱网页版入口 163邮箱在线使用
人教版电子教材在线获取指南
《腾讯相册管家》注销账号方法
微星主板BIOS怎么调整内存时序_内存参数手动优化BIOS设置教程
以下哪一项是古代兵书三十六计中的计谋
小红书网页版首页入口 小红书网页版电脑端官方登录链接
邦丰播放器频道搜索设置
Flexbox布局:实现粘性导航与底部页脚的完美结合
悟空浏览器网页版链接 悟空浏览器网页版最新有效地址
抖音火山版如何进行提现
Fedora怎么安装 Fedora Workstation安装步骤
视频号视频怎么提取文案?提取的文案如何优化与使用?
如何在mysql中比较InnoDB和MyISAM区别
电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】
CSS动画如何实现图标旋转并放大_transform rotate scale @keyframes实现
汽水音乐官方网站登录入口_汽水音乐网页版进入链接
优化Leaflet弹出层图片显示:条件渲染策略
mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法
mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧
PHP页面重载后变量状态保持:实现用户档案连续浏览的教程
《雅迪智行》用手机开锁方法
iCloud官方网站 iCloud网页版在线登录入口
word页码灰色不能用如何解决
电脑没有声音了怎么办 电脑声音问题的全面排查与修复指南【详解】
VBA Outlook邮件自动化:高效集成Excel数据与列标题的策略
2025-10-12
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。