// 排序
// data: any[] 待排序的陣列資料
// sortBy: string , 排序方式 up: 升冪 ,down: 降冪
// fieldName?: string ,
// 如果陣列是 Object 資料型態時, 用於指定欲排序的資料欄位名稱
// Object 資料型態以外的陣列是無效的
Sort(data: any[], sortBy: string, fieldName?: string): any[] {
let ret;
switch (this.getArrayDataType(data, 0)) {
case 'number':
ret = (this.SortNumberArray(data, sortBy));
break;
case 'string':
ret = (this.SortStringArray(data, sortBy));
break;
case 'object':
ret = (this.SortObjectArray(data, fieldName, sortBy));
break;
default:
ret = data;
break;
}
return ret.slice();
}
// 排序數值陣列
// data: any[] 待排序的陣列資料
// sortBy: string , 排序方式 up: 升冪 ,down: 降冪
private SortNumberArray(data: any[], sortBy: string): any[] {
let ret;
if (data.length <= 0)
return data;
switch (sortBy) {
case 'up':
ret = data.sort((n1, n2) => n1 - n2);
break;
case 'down':
ret = data.sort((n1, n2) => n2 - n1);
break;
default:
ret = data;
break;
}
return ret;
}
// 排序字串陣列
// data: any[] 待排序的陣列資料
// sortBy: string , 排序方式 up: 升冪 ,down: 降冪
private SortStringArray(data: any[], sortBy: string): any[] {
let ret;
if (data.length <= 0)
return data;
switch (sortBy) {
case 'up':
ret = data.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
break;
case 'down':
ret = data.sort((a, b) => a < b ? 1 : a > b ? -1 : 0);
break;
default:
ret = data;
break;
}
return ret;
}
// 排序 Object 陣列
// data: any[] 待排序的陣列資料
// sortBy: string , 排序方式 up: 升冪 ,down: 降冪
// fieldName?: string ,
// 如果陣列是 Object 資料型態時, 用於指定欲排序的資料欄位名稱
private SortObjectArray(data: any[], fieldName: string, sortBy: string): any[] {
let ret;
if (data.length <= 0)
return data;
if (fieldName == undefined || fieldName == null || fieldName.trim()=='') {
fieldName = Object.keys(data[0])[0];
}
switch (sortBy) {
case 'up':
ret = data.sort((o1, o2) => o1[fieldName] < o2[fieldName] ? -1 : o1[fieldName] > o2[fieldName] ? 1 : 0);
break;
case 'down':
ret = data.sort((o1, o2) => o1[fieldName] < o2[fieldName] ? 1 : o1[fieldName] > o2[fieldName] ? -1 : 0);
break;
default:
ret = data;
break;
}
return ret;
}
// 取得陣列資料的資料型態字串(以陣列的第一個資料元素為判定的依據,雖然這是不正確的作法)
// data: any[] , 陣列資料
// index: number 陣列索引值, 由 0 開始
private getArrayDataType(data: any[], index: number): string {
if (data.length < index)
return null;
return (typeof data[index]);
}