2 回答

TA貢獻1883條經驗 獲得超3個贊
看起來您的數據被 Firebase SDK 解釋為數組,因為它以連續的數字鍵開頭。如果打印快照的值gebruikers
,您會看到它是:
[null, null, null, {email: "test", uid: "test"}, {email: "wouter@...", uid: "..."}]
這些null
值由 Firebase SDK 添加,以將鍵轉換為正確的數組。
如果您希望阻止 Firebase SDK 將數據轉換為數組,請在鍵前添加非數字字符。例如:
"key2": {email: "test", uid: "test"}, "key3": {email: "wouter@...", uid: "..."}
一般來說,使用用戶的 UID 作為用戶集合中的鍵更為慣用。這樣,您就不需要查詢 UID,并且會自動保證每個用戶/UID 只能出現在集合中。

TA貢獻1796條經驗 獲得超10個贊
我更改了數據庫,就像您在此處看到的那樣。正如 Frank 所預測的那樣,我的問題根源在于我沒有發布的函數。
通過將從數據庫獲取的所有 UID 索引轉換為連續的數字鍵,我成功地使 forEach 函數正常工作。我這樣做是使用users = Object.values(users).filter((el) => {return el != null}). 完整的效果鉤子可以在下面找到:
? useEffect(() => {
? ? var refCodes = firebase.database().ref("userdata/" + currentUser.uid + "/docentCodes").orderByKey();
? ? refCodes.once("value").then(function (snapshotCodes) {
? ? ? snapshotCodes.val().forEach(function (code) {
? ? ? ? var refCodeData = firebase.database().ref("klassencodes/" + code).orderByKey();
? ? ? ? refCodeData.once("value").then(function (snapshotCodeData) {
? ? ? ? ? var users = snapshotCodeData.val().gebruikers;
? ? ? ? ? users = Object.values(users).filter((el) => {return el != null})
? ? ? ? ? if(snapshotCodeData.val() !== null) {
? ? ? ? ? ? setUsercount(oldArray => [...oldArray, users.length]);
? ? ? ? ? ? setKlasData(oldArray => [...oldArray, snapshotCodeData.val()]);
? ? ? ? ? ? setUserdata(oldArray => [...oldArray, users]);
? ? ? ? ? ? addCode(oldArray => [...oldArray, code])
? ? ? ? ? }
? ? ? ? ? setPending(false);
? ? ? ? })
? ? ? })
? ? })
? }, []);
在使用此 useEffect 的函數中,我添加了const [userdata, setUserdata] = React.useState([]);從 UID 索引剝離到由數字鍵組成的索引的新信息。該用戶數據被導出到另一個函數,該函數具有原始問題中所述的效果鉤子。我將其更改為:
? useEffect(() => {
? ? if(props.userData !== undefined) {
? ? ? var data = props.userData;
? ? ? if(data !== undefined) {
? ? ? ? data.forEach(function (user) {
? ? ? ? ? if(!emails.hasOwnProperty(user.email)) {
? ? ? ? ? ? addEmail(oldArray => [...oldArray, user.email]);
? ? ? ? ? ? addUID(oldArray => [...oldArray, Object.keys(props.klasData.gebruikers)]);
? ? ? ? ? }
? ? ? ? ? setPending(false)
? ? ? ? })
? ? ? }
? ? }
? }, []);
概括
回想起來,我應該只為用戶數據 ( ) 使用單獨的常量snapshotCodeData.val().gebruikers,與從快照 ( snapshotCodeData.val()) 返回的其他數據分開。
我希望這可以幫助你。黃金代碼行是users = Object.values(users).filter((el) => {return el != null}).
添加回答
舉報