提问人:Zac 提问时间:10/27/2023 最后编辑:PM 77-1Zac 更新时间:10/30/2023 访问量:70
如何计算作为对象一部分的多个数组中字符串的出现次数?
How do I count the occurrences of a string within multiple arrays that are part of an object?
问:
我有一个练习,要求我使用 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++;
};
};
};
任何帮助将不胜感激。
答:
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'
评论
Object.values
,您还可以在循环中的某个地方设置一个断点并检查例如的值,这样您就会看到,这不是您期望的那样......for .. in
tutor
tutor
tutor[i]
"cat"