Javascript firebase Query.orderBy*返回无序列表
我正在运行测试以了解firebase查询的行为 这是返回传递给它的查询的常规函数: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"
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方法的输出不同。它成功地根据传递键的值安排学生:exchem
它仍然在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方法的输出不同。它成功地根据传递键的值安排学生:exchem
它仍然在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相同;这正是我的答案。请查看其中建议的编辑;这正是我的答案。请查看其中建议的编辑。