如何计算作为对象一部分的多个数组中字符串的出现次数?

How do I count the occurrences of a string within multiple arrays that are part of an object?

提问人:Zac 提问时间:10/27/2023 最后编辑:PM 77-1Zac 更新时间:10/30/2023 访问量:70

问:

我有一个练习,要求我使用 for 循环来遍历对象“tutorPetTypes”并计算导师拥有的猫的总数。

这是我当前的代码。它运行,但结果是 totalCats = 0,而它应该是 7。

如果我将 console.log(tutor) 作为 if 语句的一部分,我可以看到它正确地遍历了 tutors,但我显然在正确检查数组中的“cat”方面遗漏了一些东西。

const tutorPetTypes = {
  'Sarah': ['cat'],
  'Jim': ['dog', 'dog'],
  'Joe': ['mouse'],
  'Róisín': ['cat','cat','cat','cat','cat','dog'],
  'Edd': ['lizard', 'cat'],
  'Lewis': ['bearded dragon', 'tortoise']
}

let totalCats = 0

//Solution to be provided below

for (const tutor in tutorPetTypes) {
  for (let i = 0; i < tutor.length; i++) {
      if (tutor[i] === "cat") {
      totalCats++;
    };
  };
};

任何帮助将不胜感激。

JavaScript 数组 if-statement 嵌套 for-loop

评论

0赞 PM 77-1 10/27/2023
这回答了你的问题吗?Javascript:将变量与值数组进行比较
1赞 derpirscher 10/27/2023
看看文档)真正做了什么。您可能想使用 Object.values,您还可以在循环中的某个地方设置一个断点并检查例如的值,这样您就会看到,这不是您期望的那样......for .. intutor
2赞 Heretic Monkey 10/27/2023
最重要的是,学习使用调试器单步执行代码,以便了解哪些值具有、具有哪些值,以及为什么将其与值进行比较没有意义。tutortutor[i]"cat"
0赞 derpirscher 10/27/2023
这回答了你的问题吗?如何循环或枚举 JavaScript 对象?
0赞 derpirscher 10/27/2023
@PM77-1 可能不是,因为问题似乎不是搜索数组,而是从对象中获取数组......

答:

1赞 Timur 10/28/2023 #1

应考虑改用对象值的循环。示例如下。for...of

我还提供了一个替代方案,以防您被允许摆脱 for 循环。在这种替代方法中,您可以映射对象的值并过滤每个人的 animals 数组以仅返回猫。然后,展平数组,因为映射结果将是数组的嵌套数组,并获取其长度。

const tutorPetTypes = {
  Sarah: ['cat'],
  Jim: ['dog', 'dog'],
  Joe: ['mouse'],
  Róisín: ['cat', 'cat', 'cat', 'cat', 'cat', 'dog'],
  Edd: ['lizard', 'cat'],
  Lewis: ['bearded dragon', 'tortoise'],
}

let totalCats = 0

for (const animals of Object.values(tutorPetTypes)) {
  for (let i = 0; i < animals.length; i++) {
    if (animals[i] === 'cat') {
      totalCats++
    }
  }
}

console.log(totalCats)

// To be consistent with for...of, you can do:
totalCats = 0
for (const animals of Object.values(tutorPetTypes)) {
  for (const type of animals) {
    if (type === 'cat') {
      totalCats++
    }
  }
}

console.log(totalCats)

// Another alternative would be:
totalCats = Object.values(tutorPetTypes)
  .map((animals) => animals.filter((type) => type === 'cat'))
  .flat().length

console.log(totalCats)

0赞 Zac 10/30/2023 #2

谢谢大家的回复。

我发现有趣的是,没有人愿意提供用于...在,我不是说以批判的方式,只是观察。很明显,有更高级的函数为这个练习提供了更合适的解决方案,因为有这么多人建议它,即 Object.values。但是,该练习特别要求我使用 a 用于...in 循环。(我不知道为什么)您的回答确实帮助我分析了我的解决方案,并最终提出了一个可行的解决方案。是这个:

for (const tutor in tutorPetTypes) {
  for (let i = 0; i < tutor.length; i++) {
      if (tutorPetTypes[tutor][i] === "cat") {
      totalCats++;
    };
  };
};

它只需要改成[tutor][i]tutorPetTypes[tutor][i]

以前,它会遍历导师姓名的每个字母,因此返回 0。=== 'cat'