为了账号安全,请及时绑定邮箱和手机立即绑定

当索引从 0 以外的任何值开始时,forEach 不是一个函数

当索引从 0 以外的任何值开始时,forEach 不是一个函数

慕姐8265434 2023-08-24 18:27:35
当对象内部不存在以 0 开头的索引时,它返回:类型错误:data.forEach 不是函数数据库如下所示:如果我将索引为 0 的对象添加到数据库中,如下所示(我的格式并不重要,这只是为了说明层次结构):0: {  email: "testmail",  uid: "testuid"}突然,forEach 函数开始工作,并且还检索索引为 3 和 4 的用户。例如,如何使 forEach 循环从索引 3 开始?或者我应该使用不同的方法?我的代码:  useEffect(() => {    if(props.klasData.gebruikers !== undefined) {      var data = props.klasData.gebruikers;      data.forEach(function (user) {        if(!emails.hasOwnProperty(user.email)) {          addEmail(oldArray => [...oldArray, user.email]);        }        setPending(false)      })    }  }, []);编辑 props.klasData.gebruikers 返回“gebruikers”对象中的所有键及其子项。
查看完整描述

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 只能出现在集合中。


查看完整回答
反对 回复 2023-08-24
?
白衣染霜花

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}).


查看完整回答
反对 回复 2023-08-24
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信