【问题标题】:firebase sort reverse orderfirebase 排序逆序
【发布时间】:2017-09-01 08:14:17
【问题描述】:

var playersRef = firebase.database().ref("team_mapping/");


playersRef.orderByChild("score").limitToFirst(7).on("child_added", function(data) {
}

使用此查询,我可以按升序对其进行排序。但是,我想按降序排序。任何机构都可以建议我用一些方法来做到这一点。任何帮助将不胜感激。

提前致谢!!

【问题讨论】:

  • 我猜你可以使用优先级firebase.google.com/docs/reference/js/…
  • 我们只能使用一个订单.. & orderByPriority() 不需要任何参数来传递。所以它就这样来了。
  • 感谢您的尝试。我运行了这样的查询。如果需要,您可以查看并更正它吗 var playerRef1 = firebase.database().ref("team_mapping/"); playerRef1.orderByPriority().on("child_added", function(data) { console.log("Score values------->"+data.val().score); })
  • 看看这是否有帮助:stackoverflow.com/a/40280032/1753177
  • 优先级也将始终按升序排列,但您可以控制优先级的值,例如,您可以将优先级设置为score的负数

标签: sorting firebase firebase-realtime-database


【解决方案1】:

您可以限制为最后 7 个,这将为您提供最高分,因为查询是按升序排列的。然后你所要做的就是反转你得到的最后 7 个,让它们按降序排列。

var playersRef = firebase.database().ref("team_mapping/");
var playersData = [];
var pageCursor;

playersRef.orderByChild("score").limitToLast(7).on("child_added", function(data) {
    playersData = [data] + playersData;
}

更新

这是一个如何按分数分页的示例。

const query = firebase.database().ref("team_mappings").orderByChild('score');

var snapshots = [];

function reversedChildren(snapshot) {
    var children = [];
    snapshot.forEach(function (child) { children.unshift(child); });
    return children;
}

function addPlayerToLeaderBoard(snapshot) {
    var key = snapshot.key;
    var place = snapshots.indexOf(snapshot) + 1;
    var score = snapshot.child('score').val();
    $('#leaderboard').append(`<li><b>${key}: ${score}</li>`);
}

function parsePage(snapshot) {
    var children = reversedChildren(snapshot);
    children.forEach(function (child) {
        players.push(child);
        addPlayerToLeaderBoard(child);
    });
    pageCursor = children[children.length - 1];
}

function reloadPlayers() {
    players = [];
    pageCursor = null;
    query.limitToLast(5).once('value').then(parsePage);
}

function loadMorePlayers() {
    query.endAt(pageCursor).limitToLast(5).once('value').then(parsePage);
}

reloadPlayers();

$('#reload').on('click', reloadPlayers);
$('#load_more').on('click', loadMorePlayers);

【讨论】:

  • 我也试过这个 1 .. 相同的升序它即将到来。任何其他建议都可以帮助我..
  • 怎么做。你能帮帮我吗!
  • 谢谢。但我没有得到所需的输出。早些时候我从这个 data.val().score 得到排序分数;现在,如果我附加到这个数组中,它将被插入到相同的顺序中。现在你能帮我如何迭代这个数组并按降序排序
  • var playerRef1 = firebase.database().ref("team_mapping/"); playerRef1.orderByChild("score").limitToLast(7).on("child_added", function(data) { console.log("scores are ::"+data.val().score); })
  • 如果我放入一个数组,它看起来像这样 var playerRef1 = firebase.database().ref("team_mapping/");变分数=[]; playerRef1.orderByChild("score").limitToLast(7).on("child_added", function(data) { // console.log("Score 值------->"+data.val(). score); //$scope.scores=data.val().score; score=[data] + scores; // 调试器; console.log(scores); })
【解决方案2】:

只需在数组上使用 reverse(),假设如果您将值存储到数组 items[] 然后执行 this.items.reverse()

ref.subscribe(snapshots => {
       this.items = [];
      snapshots.forEach(snapshot => {

        this.items.push(snapshot);

      });
      **this.items.reverse();**
    },

【讨论】:

    【解决方案3】:

    不幸的是,目前还没有捷径。但是,如果您使用 Listview 或 Recyclerview 作为 UI,您可以通过反转 UI,通过反转 Listview 或 Recyclerview 来解决此问题

    对于 Recyclerview,您可以按如下方式反转:

    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setReverseLayout(true);
    layoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(layoutManager)
    

    对于列表视图:

    listView.setStackFromBottom(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多