сортировать массив объектов по убыванию в зависимости от целого числа объекта (angular -typescirpt) - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужна помощь в сортировке массива пользовательских объектов по их оценке. У каждого пользователя есть идентификатор пользователя, имя пользователя и т. Д. c. и оценка. Я хочу реализовать таблицу лидеров, где первый пользователь отсортированного массива находится сверху и так далее. Поэтому я получаю свой массив пользователей вроде этого (leaderboardcomponent.ts):

users: User[];

this._dataService.getUsers()
      .subscribe((Users: User[]) => this.users, err => console.log(err));

public getUsers = (): Observable<User[]> => {
    this.actionUrl = this.apiUrl + '/User';

    return this._http.get(this.actionUrl, { headers: this.headers })
      .map((response: Response) => <User[]>response.json());
  }

Я пытался:

this.users.sort(function (l, r) { return r.Score - l.Score; })

Но я не смог отобразить первого пользователя массива в соответствующий html файл. Как отсортировать массив и отобразить первого пользователя в html?

HTML that did not work: <mat-card>
                <mat-icon>filter_1</mat-icon>
                <span>
                  {{ users[0]?.Score }}
                </span>
              </mat-card>

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Просто используйте sort.

let users = [
    {name: 'User1', score:10},
    {name: 'User2', score:100},
    {name: 'User3', score:98},
];

function compare( v1, v2 ) {
  if ( v1.score < v2.score ){
    return 1;
  }
  if ( v1.score > v2.score ){
    return -1;
  }
  return 0;
}

users.sort( compare );
// [{"name":"User2","score":100},{"name":"User3","score":98},{"name":"User1","score":10}]
0 голосов
/ 21 апреля 2020
    ngOnInit() {
        this._dataService.getCurrentUserInformation().subscribe(
          user => this.user = user, 
          err => console.log(err));
        console.log(this.user);

        //get all users
        this._dataService.getUsers()
          .subscribe((Users: User[]) => this.users = Users, err => console.log(err));

        this.sortUsersDescending();

        this.getUserPosition();

      }

      sortUsersDescending() {
        function compare(v1, v2) {
          if (v1.Score < v2.Score) {
            return 1;
          }
          if (v1.Score > v2.Score) {
            return -1;
          }
          return 0;
        }

        this.users.sort(compare);
}

Это работает более или менее, текущий пользователь, который является Сарой, не отсортировал свойство (см. Изображение pls)

введите описание изображения здесь

0 голосов
/ 21 апреля 2020

Пожалуйста, попробуйте изменить метод сортировки следующим образом:

this.users.sort((l:any , r:any) => { 
   l = l.Score;
   r = r.Score;
   return l < r ? -1 : 1;
})

const users = [
  {Score: 19},
  {Score: 13},
  {Score: 22}
]

users.sort((l, r) => { 
   l = l.Score;
   r = r.Score;
   return l < r ? -1 : 1;
})

console.log(users)

А затем просто используйте это HTML:

<mat-card>
   <mat-icon>filter_1</mat-icon>
   <span>
     {{ users[0]?.Score }}
   </span>
</mat-card>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...