
本文讲解如何遍历对象中每个键对应的宠物类型数组,准确统计其中 "cat" 出现的总次数,并修正原始代码中误用 tutor.length(应为数组长度而非字符串长度)的核心错误。
本文讲解如何遍历对象中每个键对应的宠物类型数组,准确统计其中 `"cat"` 出现的总次数,并修正原始代码中误用 `tutor.length`(应为数组长度而非字符串长度)的核心错误。
在 JavaScript 中,当需要统计嵌套在对象各属性值(均为数组)中的某个字符串(如 "cat")的全局出现频次时,关键在于正确访问和遍历每一层数据结构。原始代码的问题在于:for (const tutor in tutorPetTypes) 中的 tutor 是对象的键名(如 'Sarah'、'Jim'),是字符串,而非对应数组;因此 tutor.length 返回的是键名字符数(如 'Róisín'.length === 6),而 tutor[i] 实际是在读取键名的单个字符(如 'R'、'ó'),自然永远不等于 'cat'——这导致 totalCats 始终为 0。
正确的做法是:先通过 Object.values(tutorPetTypes) 获取所有宠物类型数组组成的集合(即 [['cat'], ['dog','dog'], ...]),再对每个数组进行遍历。推荐使用语义更清晰的 for...of 循环:
let totalCats = 0;
for (const animals of Object.values(tutorPetTypes)) {
for (const type of animals) {
if (type === 'cat') {
totalCats++;
}
}
}
console.log(totalCats); // 输出: 7
该写法避免了手动管理索引,可读性强且不易出错。若需保留传统 for 循环风格,也务必确保内层循环遍历的是 animals.length(数组长度),而非 tutor.length(键名长度):
for (const tutor in tutorPetTypes) {
const animals = tutorPetTypes[tutor]; // 显式获取对应数组
for (let i = 0; i <p>此外,函数式编程方案简洁高效,适合现代开发场景:</p><pre class="brush:php;toolbar:false;">const totalCats = Object.values(tutorPetTypes)
.flatMap(animals => animals.filter(type => type === 'cat'))
.length;✅ 注意事项:
- Object.values() 返回的是数组引用,不修改原对象;
- flatMap() 可替代 map().flat(),一步完成映射与扁平化;
- 若需兼容旧环境,可用 reduce() 替代:Object.values(...).reduce((sum, arr) => sum + arr.filter(t => t==='cat').length, 0)。
掌握数据结构层级关系与迭代目标,是解决此类嵌套统计问题的根本。











