TypeScript数组排序不正确的原因



我有一个包含54个元素的数组。我想按交易金额排序。以下是代码和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

正如你所看到的,它是正确排序的。这种排序有什么问题。

因为比较值为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;
}

最新更新