2017-04-07 71 views
1

我试图将一些Firebase数据库调用移植到没有jQuery的IOT板,只是很好的旧JavaScript。尝试循环访问Firebase结果集时forEach不是函数:

在我的代码中,我原本有一个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 is not a function

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

回答

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

不是真的的foreach,但工程完全一样

,但你也可以使用地图功能

+0

这工作就像一个魅力。 –

0

Array.of(response.val()).forEach应该工作,如果它仅仅是一个类似数组的对象丢失其迭代

+0

你确定吗? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/of –

+0

或多或少,是的:'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]' –

+0

this将会生成一个带有ONE条目''arguments''而不是数组参数的数组。将代码粘贴到控制台中......它只打印一个条目,而该emntry是一个类似数组的对象。 –

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

1

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