首页 > 解决方案 > Firebase Angular - 按值对我的用户进行排序 - 排序不是函数

问题描述

我正在使用 firebase 和 Angular,这是我的用户数据库:

我的数据库图片

我想按“ptsTotal”对我的用户进行排序。

我有一个带有函数 getUsersByPoints 的 users.service。但是当我使用它时,控制台会返回给我:this.users.sort 不是一个函数。

我看不出我在哪里做错了。你能帮我找出错误或给我另一个解决方案来对我的用户进行排序吗?

非常感谢,

import { Injectable } from '@angular/core';
import {User} from '../models/user.model';
import {Subject} from 'rxjs/Subject';
import * as firebase from 'firebase';

@Injectable({
  providedIn: 'root'
})
export class UsersService {

  users: User[] = [];
  usersSubject = new Subject<User[]>();

  constructor() { }

  emitUsers(){
    this.usersSubject.next(this.users);
  }

  saveUsers(){
    firebase.database().ref('/users').set(this.users);
  }

  getUsers(){
    firebase.database().ref('/users')
    .on('value',(data)=>{
      this.users = data.val() ? data.val() : [];
      this.users.sort((a,b)=>a.ptsTotal-b.ptsTotal);
      this.emitUsers();
    });
  }

标签: javascriptangularfirebasefirebase-realtime-database

解决方案


data.val()不会是一个数组。这将是一个对象,其属性的名称与用户下的子键相同(例如“-M9YJ ...”)。这些属性将进一步包含每个孩子下的数据。

如果您需要按子值排序,实时数据库实际上可以orderByChild()按照文档中的说明为您执行此操作。您无需在客户端中进行排序。

如果您仍想在客户端中排序,则必须以某种方式将该对象转换为数组,然后将排序应用于该新数组。


推荐阅读