getIntersection(a: any[], b: any[], key: string)
取回二個物件陣列的交集
getCombineAndCanRepeating(a: any[], b: any[])
取回二個物件陣列的 無條件 合併結果
getCombineAndNonRepeating(a: any[], b: any[], key: string)
取回二個物件陣列的 關鍵值不重複 合併結果
Sort(data: any[], sortBy: string, fieldName?: string)
排序
ngOnInit() {
    var a = [{ sn: 1, no: '1', name: 'name1' }, { sn: 2, no: '2', name: 'name2' }, { sn: 3, no: '3', name: 'name3' }, { sn: 4, no: '4', name: 'name4' }];
    var b = [{ sn: 4, no: '4', name: 'name4' }, { sn: 5, no: '5', name: 'name5' }, { sn: 3, no: '3', name: 'name3' }];
    const r2 = this.getCombineAndNonRepeating(a, b, 'no');
    const r3 = this.getCombineAndCanRepeating(a, b);    
    const r4 = this._array.Sort(r3, 'up', 'no');    
    console.log(r1);
    console.log(r2);
    console.log(r3);
    console.log(r4);
  }
  // 取回二個物件陣列的交集
  getIntersection(a: any[], b: any[], key: string) {
    var ret: any[] = [];
    a.map(
      av => {
        b.map(
          bv => {
            if (av[key] == bv[key]) {
              ret.push(av)
            }
          })
      });
    return ret;
  }
  // 取回二個物件陣列的 無條件 合併結果
  getCombineAndCanRepeating(a: any[], b: any[]) {
    var ret: any[] = [];
    a.map(
      av => {
          ret.push(av);
      });
    b.map(
      bv => {
          ret.push(bv);
      });
      return ret;
  }
  // 取回二個物件陣列的 關鍵值不重複 合併結果
  getCombineAndNonRepeating(a: any[], b: any[], key: string) {
    var ret: any[] = [];
    a.map(
      av => {
        if (!ret.find(a => a[key]==av[key])){
          ret.push(av);
        }
      });
    b.map(
      bv => {
        if (!ret.find(b => b[key]==bv[key])){
          ret.push(bv);
        }
      });
      return ret;
  }
    // 排序
    // 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]);
    }
 
沒有留言:
張貼留言