【问题标题】:forEach is not a function when trying to loop through Firebase result set:尝试遍历 Firebase 结果集时,forEach 不是函数:
【发布时间】:2017-04-08 11:35:57
【问题描述】:

我正在尝试将我的一些 Firebase 数据库调用移植到没有 jQuery 的 IOT 板,只有好的旧 JavaScript。

在我的代码中,我最初有一个 jQuery $.each(tripData, function(index, element) ...循环遍历我的结果。

我已将其切换为:

var tripsRef;
tripsRef = firebase.database().ref('trips/');
tripsRef.orderByChild('timestamp').limitToLast(100).on('value', function (response) {
var tripData = response.val();
tripData.forEach(function (index, element) {
    if (element.status >= 0) {
        var trip = new Object();
        trip.id = index;
        trip.launch = element.launch;
        trip.status = element.status;
    }
});

...但是,我收到以下错误:

forEach 不是函数

我不知道如何解决这个问题。

【问题讨论】:

    标签: javascript firebase-realtime-database


    【解决方案1】:
    for(let index in tripData){
      element = trimpData[index];
    }
    

    不是真正的 foreach,但完全一样

    但你也可以使用地图功能

    【讨论】:

      【解决方案2】:

      您应该真正弄清楚您的响应是数组还是对象。 $.each() 迭代数组和对象,这就是它起作用的原因。

      如果你真的想遍历这个对象tripData,你应该使用for...in 语句。

      for(let prop in tripData)
      { 
         if (tripData.hasOwnProperty(index))
         { 
           item = tripData[prop];
            // do stuff
          }
      }
      

      在此处了解for...in 声明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

      【讨论】:

        【解决方案3】:

        虽然@TypedSource 的答案将遍历生成的孩子,但它的迭代顺序是不确定的 - 很可能不会是时间戳。

        作为查询结果获得的快照包含每个子项的三条信息:它的键、它的值、它相对于其他子项的位置。当您在快照上调用 .val() 时,您将失去相对顺序。

        为了保持顺序,使用快照的内置forEach()方法:

        var tripsRef;
        tripsRef = firebase.database().ref('trips/');
        tripsRef.orderByChild('timestamp').limitToLast(100).on('value', function (response) {
          var index = 0;
          response.forEach(function (child) {
            var element = child.val();
            if (element.status >= 0) {
              var trip = new Object();
              trip.id = index;
              trip.launch = element.launch;
              trip.status = element.status;
            }
            index++;
          });
        });
        

        【讨论】:

          【解决方案4】:

          Array.of(response.val()).forEach 如果只是一个缺少迭代器的类数组对象,则应该可以工作

          【讨论】:

          • 或多或少,是的:function a() { Array.of(arguments).forEach(a => console.log(a)) } undefined a(1,23,4) VM2663:2 [1, 23, 4, callee: function, Symbol(Symbol.iterator): function]
          • 这将生成一个数组,其中包含一个条目 arguments 而不是数组参数。将您的代码粘贴到控制台中。它只打印一个条目,并且该 emntry 是一个类似数组的对象。
          • 不。请参阅我在第一条评论中发布的块中的输出。那是从控制台。有一个数组,arguments 中的每个条目作为数组中的一个单独位置。
          • 那么如果你这样做为什么会得到同样的结果:function a() { console.log(arguments) } 然后a(1,23,4) :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-05
          • 1970-01-01
          • 2011-11-30
          • 2021-05-18
          • 2018-03-03
          • 2017-10-23
          • 2019-02-18
          相关资源
          最近更新 更多