【问题标题】:Pick random value from firebase snapshot从 Firebase 快照中选择随机值
【发布时间】:2013-09-30 04:14:18
【问题描述】:

我正在使用 firebase 的 foreach 从这个 url 获取树中的每个孩子

目标,当页面加载时从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);
});

}
});

在我有一个随机类别“电子产品”后,我会得到一个新快照并让它返回电子产品中的任何随机项目

 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);

【问题讨论】:

标签: javascript jquery firebase


【解决方案1】:

很遗憾,无法从 Firebase 的列表中随机获取项目。你可以用 limit(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++;
});

【讨论】:

  • 3年后还是不行?
  • 我也想用
  • 2017 年了,这仍然是一个很好的解决方案,虽然 Google 发布了一项新服务“Functions”,但这是针对移动应用后端的
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-30
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多