根据Firebase中的数组位置检索对象

时间:2015-07-27 20:16:24

标签: javascript arrays firebase firebase-realtime-database

我使用Firebase进行项目,需要根据数组位置返回一个对象。

在文档中,我找到了关于返回和列出完整对象数组,父对象中找到的子属性等的解释,但没有找到按父数组中的位置返回对象的说明。

换句话说,如果我有一个dinos的Firebase数组:

"dinos" :
    {
      "lambeosaurus": {
        "height" : 2.1,
        "length" : 12.5,
        "weight": 5000
      },
      "stegosaurus": {
        "height" : 4,
        "length" : 9,
        "weight" : 2500
      }
    }

有没有办法让我返回存储在dinos [1]中的对象?

3 个答案:

答案 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的插入等,而无需写出大量数据 - 只需更改索引即可。