技术:Angular 7,AngularCli,JS和TS。
在Js中,如何按升序和降序对数组数组进行排序
这是我的示例数组:
this.tableRows = [
[ 'zz', 'cc' ],
[ 'aa', 'cc' ],
[ 'uu', 'dd' ]
];
我想按列位置和asc / desc对以上内容进行排序。
这是我的HTML:
<tr ls-table-row class="child-row" *ngFor="let row of tableRows">
<td ls-table-cell *ngFor="let cell of row">{{ cell }}</td>
</tr>
我将像这样传递类型和columnPosition的@inputs:
@Input() public sortByColumnPosiition = 1;
@Input() public sortByType = 'asc';
这些说明了我要排序和键入的列,说明了方向,例如描述
这是我当前的排序示例:
sortByColumnPosition = 0;
sortByType = 0;
public sortBy(data: Array<Array<any>>) {
return [ ...data ].sort((a, b) => a[ this.sortByColumnPosition ].localeCompare(b[ this.sortByColumnPosition ]) * this.sortByType);
}
以上是我目前的尝试-但仅适用于第0列,不适用于第1列
答案 0 :(得分:3)
您可以创建一个函数,该函数采用Array,列号和排序顺序(asc / desc)。
您可以使用技巧来对asc / desc排序使用相同的功能。有一个变量,其值为1
或-1
。始终将其乘以每个结果或sort()
回调。如果您将通过1
,它将对-1
的升序和降序进行排序
const tableRows = [
['zz', 'cc'],
['aa', 'cc'],
['uu', 'dd']
];
function sortBy(arr, col, type = 1) {
return [...arr].sort((a, b) => a[col].localeCompare(b[col]) * type)
}
console.log(sortBy(tableRows, 1)) //asc
console.log(sortBy(tableRows, 0, -1)) //desc
答案 1 :(得分:0)
您可以使用.localeCompare()
来检查哪个字符串按排序顺序排在首位。
const tableRows = [
[ 'zz', 'cc' ],
[ 'aa', 'cc' ],
[ 'uu', 'dd' ]
];
function sortAscending(arr) {
// To avoid mutating the original array, make a deep copy
const arrToSort = Array.from(arr);
return arrToSort.sort(([a, b], [c, d]) => a.localeCompare(c) || b.localeCompare(d));
}
function sortDescending(arr) {
// To avoid mutating the original array, make a deep copy
const arrToSort = Array.from(arr);
return arrToSort.sort(([a, b], [c, d]) => c.localeCompare(a) || d.localeCompare(b));
}
const sortedAscArr = sortAscending(tableRows);
const sortedDescArr = sortDescending(tableRows);
console.log(sortedAscArr);
console.log(sortedDescArr);
答案 2 :(得分:0)
如果使用的是角形,则可以使用管道在asc / desc中进行排序
import { Pipe, PipeTransform } from "@angular/core";
@Pipe({
name: "sort"
})
export class ArraySortPipe implements PipeTransform {
transform(array: any, field: string): any[] {
if (!Array.isArray(array)) {
return;
}
function sortBy(arr, field){
let type = 1;
let col = 0;
if(field == 'DESC'){
type = -1;
col = 0;
}
return [...arr].sort((a,b) => a[col].localeCompare(b[col]) * type)
}
sortBy(array,field)
}
}
<tr ls-table-row class="child-row" *ngFor="let row of tableRows | sort:'ASC'>
<td ls-table-cell *ngFor="let cell of row">{{ cell }}</td>
</tr>