firebase Query.orderBy * возвращает неупорядоченный список - PullRequest
0 голосов
/ 02 января 2019

Я запускаю тесты, чтобы понять поведение запросов Firebase.

Это общая функция для возврата переданного ей запроса:

function logVal( query , tag ){
    return query.on('value', function(snapshot) {
         console.log( tag , snapshot.val());
    });
}

в этих тестовых примерахвозвращенный список совпадает с моими исходными данными без упорядочивания!.

sRef = firebase.database().ref("students");
logVal ( "orderByChild" , sRef.orderByChild("bio") ) ;
logVal ( "orderByChild" , sRef.orderByChild("chem") ) ;
logVal ( "orderByChild" , sRef.orderByChild("physics") ) ;
logVal ( "orderByKey",  sRef.orderByKey());
logVal ( "orderByValue" , sRef.orderByValue() );

это мои данные модели

{
   students: {


  "fahd": {
      "physics": 9,
      "chem"   : 2,
      "bio"    : 0
  }
     ,
     "nasser": {
         "physics": 8,
         "chem"   : 7,
         "bio"    : 6
     }

     ,

     "ahmad": {
      "physics": 7,
      "chem"   : 5,
      "bio"    : 9
    },
    "ali": {
        "physics": 9,
        "chem"   : 9,
        "bio"    : 9
    }
    ,
     "hus": {
         "physics": 10,
         "chem"   : 5,
         "bio"    : 6
     }

   }
}
;

Ответы [ 2 ]

0 голосов
/ 02 января 2019

При вызове snapshot.val() результаты преобразуются в объект JSON.А порядок свойств в объекте JSON по определению не определен.

Поэтому, если вы хотите отобразить результаты по порядку, вам нужно обработать их, используя snapshot.forEach:

return query.on('value', function(snapshot) {
  snapshot.forEach(function(child) {
     console.log( tag , child.val());
  });
})

Вторая проблема заключается в том, что orderByValue будет работать только в том случае, если дочерние узлы имеют примитивное значение.Поскольку ваши узлы в users сами являются объектами JSON, у них нет значения, по которому можно отсортировать данные, и, таким образом, узлы возвращаются в неопределенном порядке.

0 голосов
/ 02 января 2019

Я нахожу частичное решение:

при изменении функции logVal на:

function logVal( tag, query ){
   return query.on('value', function(snapshot) {
      console.log(tag)
      snapshot.forEach(function(snapshot) {
      var val = snapshot.val();
      console.log("student: " + snapshot.key +
                   "bio: " + val.bio +  
                   "physics: " + val.physics + 
                   " chem: " + val.chem )
 });
 });
 }

выходные данные отличаются в методах orderByChild.Успешно расположить учащегося в соответствии со значением переданного ключа: например, chem

, он по-прежнему возвращает ту же модель данных в orderByKey & orderByValue.

Ошибка воригинальная функция logVal, может быть потому, что объект словаря не является отсортированным объектом.поэтому, когда мы вызываем console.log(), весь объект преобразуется в массив, который теряет порядок.

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