Firebase云存储集合Map与forEach的区别

4

我正在尝试使用map函数来创建从集合返回的项目数组。

我的实现是使用forEach进行迭代,这可以正常工作。但是,我无法让它与map函数一起工作。

以下是代码:

firestore.collection("notes").doc(this.props.id).collection('items').get()
.then((snap) => {
    let items = []
    snap.forEach((doc) => {
        items.push({id:doc.id,text:doc.data().text})
        console.log(`${doc.id} => ${doc.data()}`);
    });
    console.log(items)
});

然而,这不起作用:

firestore.collection("notes").doc(this.props.id).collection('items').get()
.then((snap) => {
    let items = snap.map((doc) => {
        return {id:doc.id, text:doc.data().text}
    })
    console.log(items)
});

它报错说'snap.map'不是一个函数。

我无法确定自己出了什么问题?

3个回答

11

forEach方法是存在的,但是没有map方法。

不过你可以获取 docs 数组:

QuerySnapshot中所有文档的数组。

你可以像这样调用map函数:

let items = snap.docs.map(doc => {
    return { id: doc.id, text: doc.data().text }
})

非常感谢。我已经为了弄清楚为什么snapshot.forEach()可以工作而Object.values(snapshot).map()不能工作而苦恼了数小时。你的方法可行。 - NubSteel

1

snap 可能不是真正的数组。它可能是某种类似数组的对象。尝试使用展开运算符 (...) 创建一个新的数组,然后在该数组上进行操作,像这样:

firestore.collection("notes").doc(this.props.id).collection('items').get()
.then((snap) => {
    let items = [...snap].map((doc) => {
        return {id:doc.id, text:doc.data().text}
    })
    console.log(items)
});

那应该将其转换为真正的数组,这样您就可以使用.map函数。

0
一个小例子,以我的情况为例,我正在更新某些内容:
const query = ...collection("notes").doc(this.props.id).collection('items');

query.snapshotChanges().map(changes => {
     changes.map(a => {
     const id = a.payload.doc.id;
     this.db.collection("notes").doc(this.props.id).collection('items').update({
            someItemsProp: newValue,
                })
            })
        }).subscribe();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接