从firebase快照中选择随机值

时间:2013-09-24 19:20:21

标签: javascript jquery firebase

我使用firebase的foreach从这个网址中将每个孩子都放在一棵树上

目标,当页面加载从firebase中抓取一个随机项并显示它

数据结构

 grabbit (table name)

      active (for active items for sale)

          category (the category of the item ie womensClothes, MensShoes etc)

                 unique id of the item

在页面加载时进入http://gamerholic.firebase.com/grabbit/active 并抓住任何一个类别并将其归还..

脚本

var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/');
grabbitRef.on('value', function(snapshot) {
if(snapshot.val() === null) {
alert("invalid");
} else {
  // get snap shot data:
 snapshot.forEach(function(snapshot) {

 var name = snapshot.name();
alert(name);
});

}
});

在我有一个随机类别说" electronics"之后,我得到一个新的快照并让它返回任何随机的电子产品

 var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name);
grabbitRef.on('value', function(snapshot) {
if(snapshot.val() === null) {
alert("invalid");
} else {
  // get snap shot data:
 snapshot.forEach(function(snapshot) {

 var id = snapshot.name();
alert(id);
});

}
});

使用id我现在可以获得项目的详细信息

var grabbitRef = new Firebase('https://gamerholic.firebaseIO.com/grabbit/active/'+name+'/'+id);

2 个答案:

答案 0 :(得分:8)

不幸的是,无法从Firebase的列表中获取随机项。你可以限制(1)来获取第一项,或者使用endAt()。limit(1)来获取最后一项。

如果您正在使用forEach,您还可以使用Math.random随机获取所有项目,然后随机选择一项。例如:

var i = 0;
var rand = Math.floor(Math.random() * snapshot.numChildren());
snapshot.forEach(function(snapshot) {
  if (i == rand) {
    // picked random item, snapshot.val().
  }
  i++;
});

答案 1 :(得分:0)

实现此目的的一种方法是使用列表中的每个元素存储一个额外的子属性,该元素将采用随机值。我们将此属性的名称称为“randomVal”。

要选择随机条目,您将使用orderByChild(“randomVal”),然后将查询限制为仅返回一个条目。在获取此条目后,您可以立即将新的随机值写入“randomVal”元素。

除了额外的簿记工作之外,这种方法的最大缺点是每次要选择随机元素时都需要写入数据库。我是firebase的新手,所以我不知道这个缺点有多重要。

此外,请确保在“randomVal”上索引数据库的这一部分,以提高查询性能。