尝试循环访问Firebase结果集时,forEach不是函数:

时间:2017-04-07 22:25:18

标签: javascript firebase-realtime-database

我正在尝试将我的一些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不是函数

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

4 个答案:

答案 0 :(得分:7)

for(let index in tripData){
  element = trimpData[index];
}

不是真正的预告,但与它完全一样

但您也可以使用地图功能

答案 1 :(得分:4)

您应该确定您的响应是数组还是对象。 CREATE PROCEDURE dbo.sp_upgraddiagrams AS BEGIN IF OBJECT_ID(N'dbo.sysdiagrams') IS NOT NULL return 0; CREATE TABLE dbo.sysdiagrams ( name sysname NOT NULL, principal_id int NOT NULL, -- we may change it to varbinary(85) diagram_id int PRIMARY KEY IDENTITY, version int, definition varbinary(max) CONSTRAINT UK_principal_name UNIQUE ( principal_id, name ) ); -- Add this if we need to have some form of extended properties for diagrams */ IF OBJECT_ID(N'dbo.sysdiagram_properties') IS NULL BEGIN CREATE TABLE dbo.sysdiagram_properties ( diagram_id int, name sysname, value varbinary(max) NOT NULL ) END IF OBJECT_ID(N'dbo.dtproperties') IS NOT NULL begin insert into dbo.sysdiagrams ( [name], [principal_id], [version], [definition] ) select convert(sysname, dgnm.[uvalue]), DATABASE_PRINCIPAL_ID(N'dbo'), -- will change to the sid of sa 0, -- zero for old format, dgdef.[version], dgdef.[lvalue] from dbo.[dtproperties] dgnm inner join dbo.[dtproperties] dggd on dggd.[property] = 'DtgSchemaGUID' and dggd.[objectid] = dgnm.[objectid] inner join dbo.[dtproperties] dgdef on dgdef.[property] = 'DtgSchemaDATA' and dgdef.[objectid] = dgnm.[objectid] where dgnm.[property] = 'DtgSchemaNAME' and dggd.[uvalue] like N'_EA3E6268-D998-11CE-9454-00AA00A3F36E_' return 2; end return 1; END 遍历数组和对象,这就是它工作的原因。

如果你真的想迭代这个对象$.each(),你应该使用for...in语句。

tripData

在此处了解for(let prop in tripData) { if (tripData.hasOwnProperty(index)) { item = tripData[prop]; // do stuff } } 语句:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

答案 2 :(得分:2)

虽然@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++;
  });
});

答案 3 :(得分:0)

如果

{{1}}只是一个类似于数组的对象而缺少其迭代器

,它应该可以工作