我使用Firebase进行项目,需要根据数组位置返回一个对象。
在文档中,我找到了关于返回和列出完整对象数组,父对象中找到的子属性等的解释,但没有找到按父数组中的位置返回对象的说明。
换句话说,如果我有一个dinos的Firebase数组:
"dinos" :
{
"lambeosaurus": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"stegosaurus": {
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
有没有办法让我返回存储在dinos [1]中的对象?
答案 0 :(得分:0)
你在这里引用的例子是关于ordering data的,我们非常不清楚你是如何试图将每条记录的唯一ID强制为数组索引的。
第一个回答:don't use arrays in distributed data
第二个答案:orderBy()
中使用的字段是索引。因此,如果我要使用同一文档中的示例:
var ref = new Firebase("https://dinosaur-facts.firebaseio.com/dinosaurs");
ref.orderByChild("height").on("child_added", function(snapshot) {
console.log(snapshot.key() + " was " + snapshot.val().height + " meters tall");
});
然后,要更改恐龙的排序,我会将height
字段更改为其他值。对于排行榜,我们会orderByChild('score')
或者,对于聊天消息列表,orderByChild('timestamp')
。然后,这些字段将控制JSON哈希的排序(即带有键的对象,这些对象在JavaScript和JSON中本质上是无序的,而不是数组)。
答案 1 :(得分:0)
对于任何有兴趣的人,这种方法都有效。如果有人对如何进行重构有反馈意见那么好。
var userDict = {};
function getUserList(){
usersRef.once("value", function(snapshot) {
userDict = snapshot.val();
for(i=0; i < Object.keys(userDict).length; i++){
console.log(Object.keys(userDict)[i]);//<---returns list of unique URLS
console.log(userDict[Object.keys(userDict)[i]].dinos);
}
});
}
答案 2 :(得分:0)
解决方案是简单地更改数据结构并查询所需的索引。
给出一个数据集(是的,'索引'上的表单很差)
"dinos" :
{
"0": {
"name": "lambeosaurus":
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"1": {
"name": "stegosaurus":
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
您现在有很多灵活性:
如果你知道'索引'号0,1等,你可以直接读入孩子。所以要在'index'#1获得dino:
Firebase *allDinosRef = [rootRef childByAppendingPath@"dinos"];
Firebase *aDinoRef = [allDinosRef childByAppendingPath@"1"];
[aDinoRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with the dino index #1 data
}];
您还可以查询特定的恐龙名称,然后获取它的父级,以便您知道它的索引。
另一种选择是利用不同的结构
"dinos" :
{
auto_generated_id: {
"name": "lambeosaurus":
"height" : 2.1,
"length" : 12.5,
"weight": 5000
"index": "0"
},
auto_generated_id: {
"name": "stegosaurus":
"height" : 4,
"length" : 9,
"weight" : 2500
"index": "1"
}
}
auto_generated_id是由childByAutoId生成的Firebase ID
使用此结构,您可以编写一个简单的查询来获取您感兴趣的索引#dino。
FQuery *allDinos = [rootRef queryOrderedByChild:@"index"];
FQuery *specificDino = [allDinos queryEqualToValue:@"1"];
[specificDino observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with Dino at 'index' 1
}];
这提供了一些额外的灵活性,您可以轻松地重新排序dino的插入等,而无需写出大量数据 - 只需更改索引即可。