我的垫表按大写单词排序,我该如何解决这个问题?

11 typescript angular-material angular

我正在尝试使用 mat-sort 以角度对一个 mat-table 进行排序,问题是当我按升序/递减顺序排序时,算法顺序首先是大写单词,而不是非大写单词。如果我有一张具有以下名称的表:

“马克”“安东尼”

“马克”比安东尼先出现。

这是算法:

sortData(sort: Sort) {
    const data = this.descricoesProdutos.slice();
    if (!sort.active || sort.direction === '') {
      this.sortedData = data;
      return;
    }

    this.sortedData = data.sort((a, b) => {
      const isAsc = sort.direction === 'asc';
      switch (sort.active) {
        case 'nome': return this.compare(a.nome, b.nome, isAsc);
        case 'descricao': return this.compare(a.descricao, b.descricao, isAsc);
        default: return 0;
      }
    });
  }


  compare(a: number | string, b: number | string, isAsc: boolean) {
  return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
  }
Run Code Online (Sandbox Code Playgroud)

我的HTML:

<table matSort (matSortChange)="sortData($event)">
Run Code Online (Sandbox Code Playgroud)

小智 14

我看到针对此用例打开了一个 Github 问题:https ://github.com/angular/components/issues/9205

\n

Dennis Du Kr\xc3\xb8ger (LosD) 提供了一个非常优雅的答案,并由 Yakir Gottesman (YakirSmartag) 进行了改进:

\n

在您的 ngOnInit() 中,添加此内容,它将适用于任何情况:

\n
this.dataSource.sortingDataAccessor = (data: any, sortHeaderId: string): string => {\n  if (typeof data[sortHeaderId] === \'string\') {\n    return data[sortHeaderId].toLocaleLowerCase();\n  }\n\n  return data[sortHeaderId];\n};\n
Run Code Online (Sandbox Code Playgroud)\n


For*_*stG 1

首先将名称设为大写(或小写),然后进行比较。那么这种差异就会消失。

 return this.compare(a.nome.toUpperCase(), b.nome.toUpperCase(), isAsc);
Run Code Online (Sandbox Code Playgroud)