根据对象在 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 的插入等,而无需写出一大堆数据 - 只需更改索引即可。