Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript firebase Query.orderBy*返回无序列表_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript firebase Query.orderBy*返回无序列表

Javascript firebase Query.orderBy*返回无序列表,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在运行测试以了解firebase查询的行为 这是返回传递给它的查询的常规函数: function logVal( query , tag ){ return query.on('value', function(snapshot) { console.log( tag , snapshot.val()); }); } 在这个测试示例中,返回的列表与我的原始数据相同,没有排序 sRef = firebase.database().ref("students"

我正在运行测试以了解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
     }

   }
}
;

我找到了部分解决方案:

将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方法的输出不同。它成功地根据传递键的值安排学生:ex
chem

它仍然在
orderByKey
orderByValue
中返回相同的数据模型


原始logVal函数中的错误可能是因为dictionary对象是未排序的对象。因此,当我们调用
console.log()
时,整个对象将转换为数组,从而丢失顺序。

我找到了部分解决方案:

将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方法的输出不同。它成功地根据传递键的值安排学生:ex
chem

它仍然在
orderByKey
orderByValue
中返回相同的数据模型


原始logVal函数中的错误可能是因为dictionary对象是未排序的对象。因此,当我们调用
console.log()
时,整个对象将转换为数组,从而丢失顺序。

当调用
snapshot.val()
时,结果将转换为JSON对象。根据定义,JSON对象中属性的顺序是未定义的

因此,如果要按顺序显示结果,则需要使用
snapshot.forEach

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


第二个问题是,
orderByValue
仅在子节点具有基元值时才起作用。由于
users
下的节点本身就是JSON对象,它们没有可以排序的值,因此节点以未指定的顺序返回。

调用
snapshot.val()
时,结果将转换为JSON对象。根据定义,JSON对象中属性的顺序是未定义的

因此,如果要按顺序显示结果,则需要使用
snapshot.forEach

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


第二个问题是,
orderByValue
仅在子节点具有基元值时才起作用。由于
users
下的节点本身就是JSON对象,因此它们没有可以排序的值,因此节点以未指定的顺序返回。

您能否显示实际的输出,以便我们可以自己查看到底发生了什么?我们能看看什么是
sRef
吗?sRef=firebase.database().ref(“学生”);&输出与数据模型相同。您可以显示实际输出,这样我们就可以自己确切地看到发生了什么?我们能看看什么是
sRef
吗?sRef=firebase.database().ref(“学生”);&输出与数据模型Hanks Frank相同;这正是我的答案。请查看其中建议的编辑;这正是我的答案。请查看其中建议的编辑。