Reactjs Firebase orderByChild未返回数组
我正试图从我的firebase数据库中检索一些数据,但我遇到了一个小问题 这是我的目标:Reactjs Firebase orderByChild未返回数组,reactjs,firebase,firebase-realtime-database,Reactjs,Firebase,Firebase Realtime Database,我正试图从我的firebase数据库中检索一些数据,但我遇到了一个小问题 这是我的目标: { "icons": [ { "type": "animal", "url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fdog.png?alt=media&token=08e0e162-8a72-4
{
"icons": [
{
"type": "animal",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fdog.png?alt=media&token=08e0e162-8a72-467b-acdd-4085ac35e9c5",
"alt": "Dog icon."
},
{
"type": "animal",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fcat.png?alt=media&token=1e58598b-00dc-4684-a349-00e1f9161256",
"alt": "Cat icon."
},
{
"type": "animal",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Ffish.png?alt=media&token=614d7867-2d43-48b7-a3ad-2680de6c7e10",
"alt": "Fish icon."
},
{
"type": "animal",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fbird.png?alt=media&token=a7020145-1a30-4728-a9bb-144716213e55",
"alt": "Bird icon."
},
{
"type": "animal",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fanimals%2Fhamster.png?alt=media&token=2ee69ccc-ef55-4219-850f-7c0c384aafb6",
"alt": "Hamster icon."
},
{
"type": "general",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F0_hamburger.png?alt=media&token=96c8779f-e261-448c-abce-41449b527f1f",
"alt": "Burger icon."
},
{
"type": "general",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F1_search.png?alt=media&token=194afb95-fd57-4a48-acb0-63893c7111fa",
"alt": "Search icon."
},
{
"type": "general",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F2_faq.png?alt=media&token=08f1e338-4e2b-4d72-a88f-4bbabf903da3",
"alt": "Faq icon."
},
{
"type": "general",
"url": "https://firebasestorage.googleapis.com/v0/b/kowloon-25cca.appspot.com/o/icons%2Fnavigation%2Fgeneral%2F3_divider.png?alt=media&token=e7dddb6e-a241-4819-8a35-5facfaf45dab",
"alt": "Divider icon."
}
]
}
现在,当我使用此查询选择一些数据时,我得到了我想要的结果(请注意equalTo()):
结果:预期日志
但现在,当我将equalTo()字段更改为“general”(其他图标的类型)时,它不会返回数组
componentWillMount = () => {
database.ref('icons').orderByChild('type').equalTo('general').on('value', snap => {
// this.setState({ icons: snap.val() });
console.log(snap.val());
})
}
结果:输出错误
如您所见,它现在返回的是一个对象而不是数组。
现在我的问题是:如何解决这个问题,使类型“general”也返回一个数组
谢谢。基于Firebase val()方法可以返回不同的数据类型
根据DataSnapshot中的数据,val()方法可能返回标量类型(字符串、数字或布尔值)、数组或对象。它还可能返回null,表示DataSnapshot为空(不包含数据)
如果需要迭代返回的值,最好使用forEach()方法。基于Firebase val()方法可以返回不同的数据类型
根据DataSnapshot中的数据,val()方法可能返回标量类型(字符串、数字或布尔值)、数组或对象。它还可能返回null,表示DataSnapshot为空(不包含数据)
如果需要迭代返回的值,最好使用forEach()方法。Firebase实时数据库不存储数组。相反,它将它们存储为常规JavaScript对象,这些对象恰好有顺序的数字键。因此,您存储的数据实际上是这样存储的:
{
"icons": {
"0": { "type": "animal", "url": "...", "alt": "Dog icon." },
"1": { "type": "animal", "url": "...", "alt": "Cat icon." },
"2": { "type": "animal", "url": "...", "alt": "Dog icon." },
"3": { "type": "animal", "url": "...", "alt": "Cat icon." },
"4": { "type": "animal", "url": "...", "alt": "Dog icon." },
...
}
}
因此,当您执行查询时,会得到这些结果的子集。在你的情况下,你似乎得到了从5到8的结果。当Firebase客户端获得类似于数组的结果时,它会将其转换回数组。但这需要例如第一个结果的索引是0
,在本例中不是这样。因此,您可以从JSON获取原始结果
要将其放入数组,您应该自己进行转换。这很简单,比如:
database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
let result = [];
snap.forEach(child => {
result.push(child.val());
});
console.log(result);
})
另见:
{
"icons": {
"0": { "type": "animal", "url": "...", "alt": "Dog icon." },
"1": { "type": "animal", "url": "...", "alt": "Cat icon." },
"2": { "type": "animal", "url": "...", "alt": "Dog icon." },
"3": { "type": "animal", "url": "...", "alt": "Cat icon." },
"4": { "type": "animal", "url": "...", "alt": "Dog icon." },
...
}
}
因此,当您执行查询时,会得到这些结果的子集。在你的情况下,你似乎得到了从5到8的结果。当Firebase客户端获得类似于数组的结果时,它会将其转换回数组。但这需要例如第一个结果的索引是0
,在本例中不是这样。因此,您可以从JSON获取原始结果
要将其放入数组,您应该自己进行转换。这很简单,比如:
database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
let result = [];
snap.forEach(child => {
result.push(child.val());
});
console.log(result);
})
另见: