从Firebase快照中获取项目数组

9
我正在尝试从Firebase数据库中获取一组项目,使用在页面加载时生成的快照。我已经将每个对象的值添加到一个数组中,现在我正在尝试使用for循环将每个对象中的一个项推入另一个数组中。
但是当我创建第二个数组时,其中的项目比快照中的对象多。
我想知道如何解决这个问题。任何帮助都将非常感谢。谢谢。
代码:
var ref = firebase.database().ref().child('/scenes/' + projId).orderByChild('wordcount');
ref.once('value',function(snap) {
    snap.forEach(function(item) {
        var itemVal = item.val();
        keys.push(itemVal);
        for (i=0; i < keys.length; i++) {
            counts.push(keys[i].wordcount);
        }
    });
});

你在哪里创建/初始化“keys”? - Frank van Puffelen
@FrankvanPuffelen 在这段代码之前,我将键和计数初始化为空数组。 - SyrupandSass
从当前的代码片段很难说出现了什么问题。你能在jsbin/jsfiddle上重现这个问题吗? - Frank van Puffelen
3个回答

19

每次你向keys中添加内容,你都会再次循环遍历它们。你应该将它放在forEach之外:

var ref = firebase.database().ref().child('/scenes/' + projId).orderByChild('wordcount');
ref.once('value',function(snap) {
    snap.forEach(function(item) {
        var itemVal = item.val();
        keys.push(itemVal);
    });
    for (i=0; i < keys.length; i++) {
        counts.push(keys[i].wordcount);
    }   
});

我现在非常喜欢你。花了太长时间尝试找出类似的东西。如此简单,不确定为什么我想不到这个 :( - JCisar
2
由于某种原因,我无法迭代Firebase快照。 Firebase最近发生了重大变化吗? 我复制并粘贴了您的代码,仍然出现相同的错误:“类型为'(item: DataSnapshot) => void'的参数不能分配给类型为'(a: DataSnapshot) => boolean'的参数。 类型“void”无法分配给类型“boolean”。”。 - Mike Axle

8

您可以使用lodash _.toArray()

_.toArray(snapshot.val())将把您的对象转换为对象数组。

文档


1
使用您的解决方案,我在 Firebase 5.3.1 中遇到了此错误:snapshot.val 不是函数。 - Marco Ottolini

1

@迈克·阿克斯:只需在forEach内部添加return true即可。这对我有效... ;)


1
实际上我需要使用 return false,因为如果用 true 会导致 forEach 中断。 - Qwerty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接