Firebase Firestore查询结果转换为可迭代类型问题
解决Firestore对象无法用forEach迭代的问题
这个问题很常见——你混淆了JavaScript对象和数组的遍历方式!
问题原因
从Firestore返回的agenda是一个普通JavaScript对象(比如你返回的{"four": true, "one": true, "three": true, "two": true}),而forEach是数组专属的方法,对象本身并没有这个方法,所以会抛出TypeError: agenda.forEach is not a function的错误。
解决方案
针对对象的遍历,JavaScript提供了几个内置方法,你可以根据需求选择:
1. 只遍历对象的值(最贴合你的需求)
用Object.values()把对象的所有值提取成数组,再用forEach迭代:
export const getTest= functions.https.onRequest(async (request,response)=>{ try{ const GlobalCalendar= await admin.firestore().doc("Calendar/GlobalCalendar").get() const agenda=GlobalCalendar.data()!.test const hours: any[]=[] // 提取对象的值组成数组,再执行forEach Object.values(agenda).forEach((weekday: any) => { hours.push(weekday) }); response.send(agenda); } catch(error){ console.log(error) response.status(500).send(error) } })
2. 遍历对象的键(如果需要用到键名)
用Object.keys()获取所有键的数组,再通过键获取对应的值:
Object.keys(agenda).forEach(key => { const value = agenda[key]; hours.push(value); // 也可以存储键值对,比如 { key, value } });
3. 同时遍历键和值
用Object.entries()直接获取键值对数组,一次拿到键和值:
Object.entries(agenda).forEach(([key, value]) => { console.log(`键:${key},值:${value}`); hours.push(value); // 按需处理数据 });
额外提示
如果你的业务逻辑允许,也可以考虑在Firestore中把test字段存储为数组类型,但显然你现在需要的是键值对结构,所以上述对象遍历方法更适合你的场景。
内容的提问来源于stack exchange,提问作者Chepe
相关产品推荐
相关产品推荐

