猿问

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

当对象内部不存在以 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”对象中的所有键及其子项。


慕姐8265434
浏览 174回答 2
2回答

白板的微信

看起来您的数据被 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 只能出现在集合中。

白衣染霜花

我更改了数据库,就像您在此处看到的那样。正如 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}).
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答