我正在尝试将地图转换为具有Firebase云功能的数组
这是我的代码。
let map = new Map();
map.set("1", 1);
map.set("2", 2);
console.log(new Array(...map).map(pairs => pairs[0]));
// Upper code not relevant: just to test, but prints ["1", "2"] in the firebase logs)
const getUser = await admin.firestore()
.collection("users")
.doc(context.auth.uid)
.get();
let userMap = getUser.data()['friendsMap'];
console.log(userMap);
// Prints this in the firebase logs: { '1234ab': 'Jeff',
5678ab: 'Bob' }
let userIDLIST = new Array(...userMap).map(pairs => pairs[0]);
console.log('userIDLIST:'+userIDLIST);
当我想将userMap转换为userIDLIST数组(代码的最后几行)时,出现错误:
Unhandled error TypeError: undefined is not a function
我在做什么错了?
谢谢!
答案 0 :(得分:1)
根据您得到的错误很难说出问题是什么(这不是很有意义!:-)),但这很可能是由于userMap
不是可迭代的事实引起的。 / p>
您将在doc中阅读(页面底部的“仅适用于迭代”):
传播语法(对于传播属性而言除外)只能应用于可迭代对象。
您可以使用下面的SO answer中的函数来检查userMap
是否可迭代。
原因是Firestore中的Map类型“代表嵌入在文档中的对象”(如数据类型的documentation中所述),而该对象实际上不是{ {3}} stricto sensu ,但简单一个Map。
如地图Object中所述(“对象与地图”部分):
对象类似于Map:两者都允许您将键设置为值,并进行检索 这些值,删除键,并检测是否有东西存储在 键。由于这个原因(并且因为没有内置 替代方案),对象在历史上一直被用作地图。
但是,有一些重要的差异使Map在 某些情况:
.....
- 地图是可迭代的,因此可以直接对其进行迭代
- 迭代对象需要以某种方式获取其密钥并对其进行迭代。
您可以通过执行以下操作来检查userMap
实际上不是地图
console.log(userMap instanceof Map); // -> False
因此,使用Object.entries()
可以解决问题:
const getUser = await admin.firestore()
.collection("users")
.doc(context.auth.uid)
.get();
const userFriendsMap = getUser.data().friendsMap;
const userFriendsArray = Object.entries(userMap);
const userIDLIST = new Array(...userFriendsArray).map(pairs => pairs[0]);