import {Pipe, PipeTransform} from "@angular/core"; @Pipe({ name: 'orderBy' }) export class OrderByPipe implements PipeTransform { transform(input:any, [config = "+"]): any { // if (!Array.isArray(value)) return value; //value 不是array,所以不能sort if (!Array.isArray(config) || Array.isArray(config) && config.length == 1) { //單一屬性進行排序 var propertyToCheck:string = !Array.isArray(config) ? config : config[0]; var desc = propertyToCheck.substr(0, 1) == '-'; //獲得一個boolean值 if (!propertyToCheck || propertyToCheck == '-' || propertyToCheck == '+') { //是個簡單數組,能夠根據數組對象進行排序,sort reverse 都是js原生代碼 return !desc ? input.sort() : input.sort().reverse(); } else { //是個複雜數組,只對其中一個屬性進行排序 var property:string = propertyToCheck.substr(0,1) == "+" || propertyToCheck.substr(0,1) == "-" ? propertyToCheck.substr(1) : propertyToCheck; return input.sort(function (a:any, b:any) { //須要在這裏使用比較器 return !desc ? OrderByPipe._orderByComparator(a[property],b[property]) : -OrderByPipe._orderByComparator(a[property],b[property]); }); } } else { //是個複雜數組,對多個屬性進行排序 return input.sort(function (a:any, b:any) { for (var i = 0; i < config.length; i++) { var desc = config[i].substr(0,1) == "-"; var property:string = config[i].substr(0,1) == "+" || config[i].substr(0,1) == "-" ? config[i].substr(1) : config[i]; var comparison = !desc ? OrderByPipe._orderByComparator(a[property],b[property]) : -OrderByPipe._orderByComparator(a[property],b[property]); if (comparison != 0) return comparison; } return 0; }); } } static _orderByComparator(a:any, b:any):number { //isFinite() 函數用於檢查其參數是不是無窮大 if ((isNaN(parseFloat(a)) || !isFinite(a)) || (isNaN(parseFloat(b)) || !isFinite(b))) { //判斷條件:若是a是數字,則parseFloat(a)會報錯,判斷條件會直接跳到else //若是a是string,且是數字開頭,好比1212a,這樣的能夠轉換爲數字1212,a會被忽略,若是以字母開頭則會報錯NaN,好比a1212 if (a.toLowerCase() > b.toLowerCase()) return 1; //說明a 的首字母比b的首字母要大,字母相比,比的是26個字母的順序,順序越日後表示越大 if (a.toLowerCase() < b.toLowerCase()) return -1; //要注意,大寫的A比小寫的z要大,因此要轉換成小寫字母 } else { if (parseFloat(a) > parseFloat(b)) return 1; if (parseFloat(a) < parseFloat(b)) return -1; } return 0; //等於0則相等 } }