如何统计嵌套对象中指定key出现次数?JS代码结果异常排查
嵌套数据中
child字段计数错误的排查与修复 问题描述
嵌套结构数据中child字段实际出现6次,但现有统计代码的控制台输出计数能到7,最终返回的总计数却始终为1,无法得到正确结果。
原代码问题分析
- 递归计数未累加:递归调用
countChild(child, cnt)时,没有接收递归返回的计数结果。JavaScript是值传递,递归内部对cnt的修改不会影响外层变量,导致外层cnt始终只累加当前层级的计数,无法汇总递归层级的结果。 - 无效计数触发:遍历数组时,无论元素是否包含
child字段,都会执行cnt = cnt +1。比如数据中id="3"的元素没有child,却被误加了1,这就是控制台计数到7的原因。
修复后的代码
let data = [{ "id": "1", "child": [ { "id": "12", "child": [ { "id": "123", "child": [ { "id": "1234" } ] } ] }, { "id": "2", "child": [ { "id": "22" } ] }, { "id": "3" }, { "id": "4", "child": [ { "id": "42", "child": [ { "id": "43" } ] } ] } ] }] const countChild = (arr, cnt = 0) => { for (const item of arr) { // 仅当元素存在有效的child数组时才计数 if (item.child && Array.isArray(item.child)) { cnt += 1; // 累加递归调用返回的计数结果 cnt = countChild(item.child, cnt); } } return cnt; }; console.log("Final count", countChild(data)); // 输出6,符合预期
修复说明
- 有效计数判断:新增
item.child && Array.isArray(item.child)的判断,确保只有存在有效child数组的元素才被计数,避免无效计数。 - 递归结果累加:将递归调用的返回值赋值给
cnt,让外层计数能汇总所有递归层级的child数量。
内容的提问来源于stack exchange,提问作者Vikas Acharya
相关产品推荐
相关产品推荐

