根据对象在 Firebase 中的数组位置检索对象
Retrieve object based on its array position in Firebase
我正在为一个项目使用 Firebase,需要 return 基于其数组位置的对象。
在文档中,我找到了关于 returning 和列出完整对象数组、在父对象中找到的子属性等的解释,但没有关于 returning 对象按位置的解释在他们的父数组中。
换句话说,如果我有一个 Firebase 恐龙数组:
"dinos" :
{
"lambeosaurus": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"stegosaurus": {
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
我有办法 return 存储在 dinos[1] 的对象吗?
您在此处引用的示例是关于 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 中本质上是无序的,而不是数组)。
对于任何感兴趣的人来说,这种方法都有效。如果有人对如何重构它有反馈,那就太好了。
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);
}
});
}
一种解决方案是简单地更改数据结构并查询所需的索引。
给定一个数据集(是的,'indexes' 上的格式很差)
"dinos" :
{
"0": {
"name": "lambeosaurus":
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"1": {
"name": "stegosaurus":
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
你现在有很大的灵活性:
如果你知道 'index' 数字 0、1 等,你可以直接读入 child。所以要在 'index' #1:
得到恐龙
Firebase *allDinosRef = [rootRef childByAppendingPath@"dinos"];
Firebase *aDinoRef = [allDinosRef childByAppendingPath@"1"];
[aDinoRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with the dino index #1 data
}];
您还可以查询特定的恐龙名称,然后获取它的 parent 这样您就可以知道它的索引。
另一种选择是利用不同的结构
"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
使用此结构,您可以编写一个简单的查询来获取您感兴趣的索引 # 处的恐龙。
FQuery *allDinos = [rootRef queryOrderedByChild:@"index"];
FQuery *specificDino = [allDinos queryEqualToValue:@"1"];
[specificDino observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with Dino at 'index' 1
}];
这提供了一些额外的灵活性,因为您可以轻松地 re-order dino 的插入等,而无需写出一大堆数据 - 只需更改索引即可。
我正在为一个项目使用 Firebase,需要 return 基于其数组位置的对象。
在文档中,我找到了关于 returning 和列出完整对象数组、在父对象中找到的子属性等的解释,但没有关于 returning 对象按位置的解释在他们的父数组中。
换句话说,如果我有一个 Firebase 恐龙数组:
"dinos" :
{
"lambeosaurus": {
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"stegosaurus": {
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
我有办法 return 存储在 dinos[1] 的对象吗?
您在此处引用的示例是关于 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 中本质上是无序的,而不是数组)。
对于任何感兴趣的人来说,这种方法都有效。如果有人对如何重构它有反馈,那就太好了。
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);
}
});
}
一种解决方案是简单地更改数据结构并查询所需的索引。
给定一个数据集(是的,'indexes' 上的格式很差)
"dinos" :
{
"0": {
"name": "lambeosaurus":
"height" : 2.1,
"length" : 12.5,
"weight": 5000
},
"1": {
"name": "stegosaurus":
"height" : 4,
"length" : 9,
"weight" : 2500
}
}
你现在有很大的灵活性:
如果你知道 'index' 数字 0、1 等,你可以直接读入 child。所以要在 'index' #1:
得到恐龙Firebase *allDinosRef = [rootRef childByAppendingPath@"dinos"];
Firebase *aDinoRef = [allDinosRef childByAppendingPath@"1"];
[aDinoRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with the dino index #1 data
}];
您还可以查询特定的恐龙名称,然后获取它的 parent 这样您就可以知道它的索引。
另一种选择是利用不同的结构
"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使用此结构,您可以编写一个简单的查询来获取您感兴趣的索引 # 处的恐龙。
FQuery *allDinos = [rootRef queryOrderedByChild:@"index"];
FQuery *specificDino = [allDinos queryEqualToValue:@"1"];
[specificDino observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with Dino at 'index' 1
}];
这提供了一些额外的灵活性,因为您可以轻松地 re-order dino 的插入等,而无需写出一大堆数据 - 只需更改索引即可。