为什么TypeScript数组排序未正确排序

时间:2020-09-28 12:19:37

标签: javascript typescript sorting

我有一个包含54个元素的数组。我想按它的transactionAmount排序。这是代码和console.log输出:-

sortData(sort: Sort) {
const data = this.dataSource.filteredData;
console.log('Before sort');
this.logAll(this.dataSource.filteredData as TransactionSearch[]);
(data as TransactionSearch[]).sort((left, right) => {
// (this.dataSource.filteredData as TransactionSearch[]).sort((left, right) => {
  const isAsc = sort.direction === 'asc';
  switch (sort.active) {
    case 'currency':
      return this.compareTransactionRow(left.currency, right.currency, isAsc);
    case 'processingState':
      return this.compareTransactionRow(left.processingState, right.processingState, isAsc);
    case 'transactionAmount':
      return this.compareTransactionRow(left.transactionAmount, right.transactionAmount, isAsc);
    case 'messageFunction':
      return this.compareTransactionRow(left.messageFunction, right.messageFunction, isAsc);
    case 'transactionDate':
      return this.compareTransactionRow(left.transactionDate, right.transactionDate, isAsc);
    default: return 0;
  }
});
this.dataSource.filteredData = data;
console.log('After sort');
this.logAll(this.dataSource.filteredData as TransactionSearch[]);
 }

 compareTransactionRow(left: string | Date, right: string | Date, isAsc: boolean) {
let result = 0;
if ( left < right ) {
  result = -1;
} else if ( left > right) {
  result = 1;
}
result = result * (isAsc ? 1 : -1);
return result;
}

 logAll(data: TransactionSearch[]) {
let i = 0;
// tslint:disable-next-line:no-shadowed-variable
data.forEach( element => {
    console.log('Element: ' + i.toString());
    // console.log(element);
    console.log('element.transactionAmount: ' + element.transactionAmount);
    i++;
  }
);
}

它是由54个元素组成的庞大数组。因此,在对console.log()进行排序之前:

 Element: 0
 element.transactionAmount: 30.00
 Element: 1
 element.transactionAmount: 100.00
 Element: 2
 element.transactionAmount: 1.00
 Element: 3
 element.transactionAmount: 3.00
 Element: 4
 element.transactionAmount: 3.00
 Element: 5
 element.transactionAmount: 1.00
 Element: 6
 element.transactionAmount: 2.00
 Element: 7
 element.transactionAmount: 2.00
 Element: 8
 element.transactionAmount: 10.00
 Element: 9
 element.transactionAmount: 10.00
 Element: 10
 element.transactionAmount: 10.00
 Element: 11
 element.transactionAmount: 10.00
 Element: 12
 element.transactionAmount: 12.00
 Element: 13
 element.transactionAmount: 12.00
 Element: 14
 element.transactionAmount: 10.00
 Element: 15
 element.transactionAmount: 10.00
 Element: 16
 element.transactionAmount: 10.00
 Element: 17
 element.transactionAmount: 1.00
 Element: 18
 element.transactionAmount: 10.00
 Element: 19
 element.transactionAmount: 100.00
 Element: 20
 element.transactionAmount: 100.00
 Element: 21
 element.transactionAmount: 100.00
 Element: 22
 element.transactionAmount: 100.00
 Element: 23
 element.transactionAmount: 10.00
 Element: 24
 element.transactionAmount: 100.00
 Element: 25
 element.transactionAmount: 1.00
 Element: 26
 element.transactionAmount: 2.00
 Element: 27
 element.transactionAmount: 100.00
 Element: 28
 element.transactionAmount: 2.00
 Element: 29
 element.transactionAmount: 2.00
 Element: 30
 element.transactionAmount: 2.00
 Element: 31
 element.transactionAmount: 10.00
 Element: 32
 element.transactionAmount: 10.00
 Element: 33
 element.transactionAmount: 100.00
 Element: 34
 element.transactionAmount: 100.00
 Element: 35
 element.transactionAmount: 100.00
 Element: 36
 element.transactionAmount: 100.00
 Element: 37
 element.transactionAmount: 50.00
 Element: 38
 element.transactionAmount: 50.00
 Element: 39
 element.transactionAmount: 50.00
 Element: 40
 element.transactionAmount: 50.00
 Element: 41
 element.transactionAmount: 100.00
 Element: 42
 element.transactionAmount: 10.00
 Element: 43
 element.transactionAmount: 100.00
 Element: 44
 element.transactionAmount: 100.00
 Element: 45
 element.transactionAmount: 10.00
 Element: 46
 element.transactionAmount: 30.00
 Element: 47
 element.transactionAmount: 100.00
 Element: 48
 element.transactionAmount: 1.00
 Element: 49
 element.transactionAmount: 1.00
 Element: 50
 element.transactionAmount: 10.00
 Element: 51
 element.transactionAmount: 10.00
 Element: 52
 element.transactionAmount: 10.00
 Element: 53
 element.transactionAmount: 10.00

排序后如下:-

 Element: 0
 element.transactionAmount: 1.00
 Element: 1
 element.transactionAmount: 1.00
 Element: 2
 element.transactionAmount: 1.00
 Element: 3
 element.transactionAmount: 1.00
 Element: 4
 element.transactionAmount: 1.00
 Element: 5
 element.transactionAmount: 1.00
 Element: 6
 element.transactionAmount: 10.00
 Element: 7
 element.transactionAmount: 10.00
 Element: 8
 element.transactionAmount: 10.00
 Element: 9
 element.transactionAmount: 10.00
 Element: 10
 element.transactionAmount: 10.00
 Element: 11
 element.transactionAmount: 10.00
 Element: 12
 element.transactionAmount: 10.00
 Element: 13
 element.transactionAmount: 10.00
 Element: 14
 element.transactionAmount: 10.00
 Element: 15
 element.transactionAmount: 10.00
 Element: 16
 element.transactionAmount: 10.00
 Element: 17
 element.transactionAmount: 10.00
 Element: 18
 element.transactionAmount: 10.00
 Element: 19
 element.transactionAmount: 10.00
 Element: 20
 element.transactionAmount: 10.00
 Element: 21
 element.transactionAmount: 10.00
 Element: 22
 element.transactionAmount: 10.00
 Element: 23
 element.transactionAmount: 100.00
 Element: 24
 element.transactionAmount: 100.00
 Element: 25
 element.transactionAmount: 100.00
 Element: 26
 element.transactionAmount: 100.00
 Element: 27
 element.transactionAmount: 100.00
 Element: 28
 element.transactionAmount: 100.00
 Element: 29
 element.transactionAmount: 100.00
 Element: 30
 element.transactionAmount: 100.00
 Element: 31
 element.transactionAmount: 100.00
 Element: 32
 element.transactionAmount: 100.00
 Element: 33
 element.transactionAmount: 100.00
 Element: 34
 element.transactionAmount: 100.00
 Element: 35
 element.transactionAmount: 100.00
 Element: 36
 element.transactionAmount: 100.00
 Element: 37
 element.transactionAmount: 100.00
 Element: 38
 element.transactionAmount: 12.00
 Element: 39
 element.transactionAmount: 12.00
 Element: 40
 element.transactionAmount: 2.00
 Element: 41
 element.transactionAmount: 2.00
 Element: 42
 element.transactionAmount: 2.00
 Element: 43
 element.transactionAmount: 2.00
 Element: 44
 element.transactionAmount: 2.00
 Element: 45
 element.transactionAmount: 2.00
 Element: 46
 element.transactionAmount: 3.00
 Element: 47
 element.transactionAmount: 3.00
 Element: 48
 element.transactionAmount: 30.00
 Element: 49
 element.transactionAmount: 30.00
 Element: 50
 element.transactionAmount: 50.00
 Element: 51
 element.transactionAmount: 50.00
 Element: 52
 element.transactionAmount: 50.00
 Element: 53
 element.transactionAmount: 50.00

如您所见,它已正确排序。这种排序有什么问题。

1 个答案:

答案 0 :(得分:0)

由于您将值比较为string而不是numbers,因此可以解析这些值:

 compareTransactionRow(left: string | Date, right: string | Date, isAsc: boolean) {
   let result = 0;
   if (typeof left === "string" && typeof right === "string") {
     left = parseFloat(left);
     right = parseFloat(right);
   } 
   if ( left < right ) {
     result = -1;
   } else if ( left > right) {
     result = 1;
   }
   result = result * (isAsc ? 1 : -1);
   return result;
  }