Я пытаюсь получить некоторые данные из своей базы данных 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-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 ()):
componentWillMount = () => {
database.ref('icons').orderByChild('type').equalTo('animal').on('value', snap => {
// this.setState({ icons: snap.val() });
console.info(snap.val());
})
}
Результат: ожидаемый журнал
Но теперь, когда я меняю поле equalTo () на «общее» - тип других значков - оно не возвращает массив.
componentWillMount = () => {
database.ref('icons').orderByChild('type').equalTo('general').on('value', snap => {
// this.setState({ icons: snap.val() });
console.info(snap.val());
})
}
Результат: неправильный вывод
Как видите, теперь он возвращает объект вместо массива. Теперь мой вопрос: как я могу это исправить, чтобы тип «общий» также возвращал массив?
Спасибо.





на основе метода Firebase документы val () может возвращать разные типы данных
Depending on the data in a DataSnapshot, the val() method may return a scalar type (string, number, or boolean), an array, or an object. It may also return null, indicating that the DataSnapshot is empty (contains no data).
если вам нужно перебрать возвращаемые значения, лучше использовать метод forEach ().
База данных Firebase Realtime не хранит массивы. Вместо этого он хранит их как обычные объекты 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.info(result);
})
Также см:
Спасибо! Не знал об этом.