Firebase orderByChild на React Native - PullRequest
1 голос
/ 08 марта 2019

У меня проблема с упорядочением списка на Android. База данных ref items / выглядит следующим образом:

{
    "11" : {
        "date" : "2018-11-18 10:07:00",
        "letter" : "F",
        "number" : 11
    },
    "12" : {
        "date" : "2018-11-01 14:41:00",
        "letter" : "B",
        "number" : 12
    },
    "13" : {
        "date" : "2018-11-13 14:00:00",
        "letter" : "C",
        "number" : 13
    },
    "14" : {
        "date" : "2019-04-22 22:15:30",
        "letter" : "D",
        "number" : 14
    },
    "15" : {
        "date" : "2019-04-22 20:33:00",
        "letter" : "H",
        "number" : 15
    },
    "16" : {
        "date" : "2019-04-22 19:30:00",
        "letter" : "J",
        "number" : 16
    },
    "17" : {
        "date" : "2019-04-25 13:10:00",
        "letter" : "G",
        "number" : 17
    },
    "18" : {
        "date" : "2019-04-25 18:00:00",
        "letter" : "E",
        "number" : 18
    },
    "19" : {
        "date" : "2019-04-25 13:00:00",
        "letter" : "I",
        "number" : 19
    },
    "20" : {
        "date" : "2019-04-28 12:30:00",
        "letter" : "A",
        "number" : 20
    }
}

Я запрашиваю его, как показано ниже, ожидая, что результаты будут упорядочены клавишей 'letter':

firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
    let items = snapshot.val()
    Object.values(items).map(i => console.log(i.number, i.letter, i.date))
})

Но я получаю результаты, как показано ниже:

11 F 2018-11-18 10:07:00
12 B 2018-11-01 14:41:00
13 C 2018-11-13 14:00:00
14 D 2019-04-22 22:15:30
15 H 2019-04-22 20:33:00
16 J 2019-04-22 19:30:00
17 G 2019-04-25 13:10:00
18 E 2019-04-25 18:00:00
19 I 2019-04-25 13:00:00
20 A 2019-04-28 12:30:00

Очевидно, что orderByChild ('letter') не применяется. Чего мне не хватать?

1 Ответ

0 голосов
/ 08 марта 2019

Очевидно, есть проблема с обработкой объектов в JavaScript, поэтому существует метод snapshot.forEach, который можно использовать вместо Object.values ​​(items) .map, который я использую. Мой слушатель должен выглядеть примерно так:

firebase.database().ref('items/').orderByChild('letter').on('value', snapshot => {
    snapshot.forEach(c => { i = c.val(); console.log(i.number, i.letter, i.date) })
})

Из-за того, как работают объекты JavaScript, упорядочение данных в объект JavaScript, возвращаемый val (), не гарантированно соответствует порядок на сервере или порядок событий child_added. То есть где forEach () пригодится. Это гарантирует детям DataSnapshot будет повторяться в порядке их запросов.

https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#forEach

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...