簡體   English   中英

Angular 5按日期,文本,數字排序

[英]Angular 5 Sort by date, text, numbers

我實現了可重用的排序功能,按數字和文本排序工作正常,但是按日期排序失敗。

orderBy(array: Array<any>, fieldName: string, direction: string) {
  return array.sort((a, b) => {
    let objectA: number|string = '';
    let objectB: number|string = '';
    [objectA, objectB] = [a[fieldName], b[fieldName]];
    let valueA = isNaN(+objectA) ? objectA.toString().toUpperCase() : +objectA;
    let valueB = isNaN(+objectB) ? objectB.toString().toUpperCase() : +objectB;
    return (valueA < valueB ? -1 : 1) * (direction == 'asc' ? 1 : -1);
  });
}

如何按日期,文本數字和特殊字符排序。

嘗試這個:

orderBy(array: Array<any>, fieldName: string, direction: string) {
  return array.sort((a, b) => {
    let objectA: number|string|Date = '';
    let objectB: number|string|Date = '';
    [objectA, objectB] = [a[fieldName], b[fieldName]];

    // I assume that objectA and objectB are of the same type
    return typeof objectA === 'string' ? objectA.localeCompare(objectB) : objectA - objectB;
  });
}

如果Date類型無法識別,則可能需要添加es6進入你的compilerOptions ,看到這個回答更多細節

更新

如果您要排序的所有值都是字符串,請嘗試以下操作:

orderBy(array: Array<any>, fieldName: string, direction: string) {
  return array.sort((a, b) => {
    let objectA: number|string|Date = '';
    let objectB: number|string|Date = '';
    // map function here will convert '15/12/2018' into '2018/12/15'
    // so we can compare values as strings, numbers and strings
    // will remain unchanged
    [objectA, objectB] = [a[fieldName], b[fieldName]].map(i => i.split('/').reverse().join('/'));

    return isNaN(+objectA) ? objectA.localeCompare(objectB) : +objectA - +objectB;
  });
}

如果您正在使用類型腳本,則可以這樣做,還沒有嘗試過,但是可以嘗試一下

public orderby(fieldName : string)
{
    switch (typeof obj[fieldName].constructor.name) {           
            case "String":
                array.sort();
            case "Number":
                  array.sort(function(a,b){
                       return a-b);
                 });
            case "Date"://you can check type and add accordingly 
            //as suggested by @Andriy  its going to be object 
                 array.sort(function(a,b){
                       return new Date(b.date) - new Date(a.date);
                 });
            default:
                throw new Error("Type of T is not a valid return type!");
        }
    } else {
        throw new Error("Key '" + key + "' does not exist!");
    }
}

對於日期排序,我確實喜歡這樣,將日期中的值轉換為減號運算的值,該值將返回零,正負vlaue

array.sort(function(a,b){
  return new Date(b.date) - new Date(a.date);
});

我認為這可能是最好的,因為localCompare函數 在after之后返回正數,在before之前返回負數,對於equals返回0 (在此示例中,我正在比較.name wich是this.array中對象ab的屬性)

this.array.sort((a, b) => { 
 return a.name.localeCompare(b.name);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM