如何仅从firebase而不是键中提取节点/值?

时间:2014-07-28 10:04:38

标签: javascript dictionary firebase

如何仅使用javascript从firebase而不是键中拉取节点?换句话说,我只想要来自下面的firebase的键值对的值,这意味着我不想要下面的唯一键,而只需要下面的内容。

Firebase Data Structure

目前,我的代码是..

function PullFirebase() {
    new Firebase('https://myfirebase.firebaseIO.com/quakes').on('value', function (snapshot) {
        var S = snapshot.val();

        function printData(data) {
            var f = eval(data);
            console.log(data + "(" + f.length + ") = " + JSON.stringify(f).replace("[", "[\n\t").replace(/}\,/g, "},\n\t").replace("]", "\n]"));
        }
        printData(S);
    });
}
PullFirebase();

这会在控制台中生成以下内容

[object Object](undefined) = {"-JStYZoJ7PWK1gM4n1M6":{"FID":"quake.2013p618454","agency":"WEL(GNS_Primary)","depth":"24.5703","latitude":"-41.5396","longitude":"174.1242","magnitude":"1.7345","magnitudetype":"M","origin_geom":"POINT (174.12425 -41.539614)","origintime":"2013-08-17T19:52:50.074","phases":"17","publicid":"2013p618454","status":"automatic","type":"","updatetime":"2013-08-17T19:54:11.27"},
    "-JStYZsd6j4Cm6GZtrrD":{"FID":"quake.2013p618440","agency":"WEL(GNS_Primary)","depth":"26.3281","latitude":"-38.8725","longitude":"175.9561","magnitude":"2.6901","magnitudetype":"M","origin_geom":"POINT (175.95611 -38.872468)","origintime":"2013-08-17T19:45:25.076","phases":"13","publicid":"2013p618440","status":"automatic","type":"","updatetime":"2013-08-17T19:48:15.374"},...

但我想只有字典,例如

[{"FID":"quake.2013p618454","agency":"WEL(GNS_Primary)","depth":"24.5703","latitude":"-41.5396","longitude":"174.1242","magnitude":"1.7345","magnitudetype":"M","origin_geom":"POINT (174.12425 -41.539614)","origintime":"2013-08-17T19:52:50.074","phases":"17","publicid":"2013p618454","status":"automatic","type":"","updatetime":"2013-08-17T19:54:11.27"},{"FID":"quake.2013p597338","agency":"WEL(GNS_Primary)","depth":"5.0586","latitude":"-37.8523","longitude":"176.8801","magnitude":"2.2362","magnitudetype":"M","origin_geom":"POINT (176.88006 -37.852307)","origintime":"2013-08-10T00:21:54.989","phases":"17","publicid":"2013p597338","status":"automatic","type":"","updatetime":"2013-08-10T03:42:41.324"}...]

1 个答案:

答案 0 :(得分:7)

如果我理解正确,您希望获得quakes下的所有子对象。

您通常有两种方法:

  1. 获取父节点的值,并在子项
  2. 上获取循环 将子项添加/更新/删除到父节点时,
  3. 监控

    你的方法与#1匹配,所以我先回答那个问题。我还将举例说明方法#2,当您的数据集发生变化时,它会更有效。

    迭代Firebase参考的孩子

    on('value',处理程序中,您可以使用forEach跳过唯一ID:

    new Firebase('https://myfirebase.firebaseIO.com/quakes').on('value', function (snapshot) {
        var quakes = [];
        snapshot.forEach(function(childSnapshot) {
            quakes.push(childSnapshot.val());
        });
        var filter = new crossfilter(quakes);
    
    });
    

    forEach函数是同步的,所以我们可以简单地等待循环完成,然后创建交叉过滤器。

    监控Firebase参考的儿童

    在这种情况下,最好的结构是:

    var quakes = new Firebase('https://myfirebase.firebaseIO.com/quakes');
    var quakeCount = 0;
    quakes.on('child_added', function (snapshot) {
        var quake = snapshot.val();
        quakeCount++;
        console.log("quakeCount="+quakeCount+", FID="+quake.FID);
    });
    quakes.on('child_removed', function (old_snapshot) {
        var quake = old_snapshot.val();
        quakeCount--;
        console.log("quakeCount="+quakeCount+", removed FID="+quake.FID);
    });
    

    使用此代码构造,您可以主动侦听添加和删除的地震。您仍然需要保留所有地震的数组,然后在child_addedchild_changedchild_removed中修改这些地震。

    他们如何比较

    首次运行代码时,监视子级将产生与on('value',构造相同的数据。但是,当以后添加/删除子项时,on('value',将再次收到所有地震,而on('child_added',on('child_removed',只会针对相关地震调用。