本文详解如何遍历包含多个字符串数组的对象,准确统计目标字符串在所有数组中出现的总次数,并提供传统 for 循环与现代函数式编程(reduce + filter)两种高效实现方案。
在实际开发中,我们常遇到结构类似 { key: string[], … } 的嵌套对象,需跨所有数组统计某字符串(如 ‘Benicassim’)的全局出现频次。初学者易误将数组整体与字符串直接比较(如 festivals[festival] === target),导致逻辑失效——因为 festivals[festival] 是一个数组,而 target 是字符串,二者恒不相等。
正确做法是:先遍历对象的每个属性(即每个数组),再遍历该数组的每个元素,逐一对比并计数。以下是两种推荐实现方式:
✅ 方案一:嵌套 for 循环(清晰直观,兼容性好)
const festivals = {
'Danny': ['Glastonbury','Glastonbury','Leeds','Leeds','Leeds','Benicassim','MadCool'],
'Jimbo': ['Glastonbury','Glastonbury','Leeds','Leeds','Leeds','Leeds','Benicassim','MadCool'],
'Richard': ['Glastonbury','Leeds','Leeds','Benicassim','MadCool'],
'John': ['Glastonbury','Leeds']
};
let totalFestivals = 0;
const target = 'Benicassim';
for (const person in festivals) {
const festivalList = festivals[person];
for (const fest of festivalList) {
if (fest === target) {
totalFestivals++;
}
}
}
console.log(totalFestivals); // 输出: 3
⚠️ 注意:使用 for…in 遍历对象时,应确保对象为纯数据对象(无原型污染)。若需更高健壮性,可加 hasOwnProperty 检查;但本例中可省略。
✅ 方案二:函数式链式调用(简洁、声明式、易于复用)
const target = 'Benicassim';
const totalFestivals = Object.entries(festivals).reduce(
(sum, [, festivalsArray]) =>
sum + festivalsArray.filter(fest => fest === target).length,
0
);
console.log(totalFestivals); // 输出: 3
该写法利用: