【问题标题】:Firebase Leaderboard JSONFirebase 排行榜 JSON
【发布时间】:2021-05-02 13:37:55
【问题描述】:

我正在使用 firebase 实时数据库,我正在尝试使用 JSON 根据点数制作国家排行榜,但是,当我将对象转换为 JSON 时,它返回未定义。

这是我的代码:

var database = firebase.database();
var userRef = database.ref('countries');
userRef.orderByChild("points").once('value', function(snapshot) {
    const json2 = JSON.stringify(snapshot.val())
    console.log(json2)
    var tr;
    var rank = 1;

    for (var i = 0; i < json2.length; i++) {
        tr = $('<tr/>');
        tr.append("<td>" + rank + "</td>");
        tr.append("<td>" + json2[i].country + "</td>");
        tr.append("<td>" + json2[i].points + "</td>");
        $('table').append(tr);
        rank = rank + 1;
    }
});

JSON:

{
   "Spain": {
      "country": "Spain",
      "points": 201
   },
   "Sweden": {
      "country": "Sweden",
      "points": 101587
   }
}

【问题讨论】:

    标签: javascript html firebase firebase-realtime-database


    【解决方案1】:

    这个循环for (var i = 0; i &lt; json2.length; i++) { 遍历json2 字符串,这可能不是你想要的。

    相反,您需要循环遍历 snapshot,然后从中提取单个值:

    var database = firebase.database();
    var userRef = database.ref('countries');
    userRef.orderByChild("points").once('value', function(snapshot) {
        var tr;
        var rank = 1;
    
        snapshot.forEach((countrySnapshot) => {
            tr = $('<tr/>');
            tr.append("<td>" + rank + "</td>");
            tr.append("<td>" + countrySnapshot.val().country + "</td>");
            tr.append("<td>" + countrySnapshot.val().points + "</td>");
            $('table').append(tr);
            rank = rank + 1;
        }
    });
    

    【讨论】:

    • 好的,另外,你知道我会怎么做才能将分数从高到低排序吗?
    • 结果总是按升序从 Firebase 返回。最简单的方法是在客户端反转它们,例如通过调用 prepend 而不是 append