2019年10月7日 星期一

Angular 物件陣列的操作參考範例


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: 1no: '1'name: 'name1' }, { sn: 2no: '2'name: 'name2' }, { sn: 3no: '3'name: 'name3' }, { sn: 4no: '4'name: 'name4' }];
    var b = [{ sn: 4no: '4'name: 'name4' }, { sn: 5no: '5'name: 'name5' }, { sn: 3no: '3'name: 'name3' }];
    const r1 = this.getIntersection(ab'no');
    const r2 = this.getCombineAndNonRepeating(ab'no');
    const r3 = this.getCombineAndCanRepeating(ab);    
    const r4 = this._array.Sort(r3'up''no');    
    console.log(r1);
    console.log(r2);
    console.log(r3);
    console.log(r4);
  }

  // 取回二個物件陣列的交集
  getIntersection(aany[], bany[], keystring) {
    var retany[] = [];
    a.map(
      av => {
        b.map(
          bv => {
            if (av[key] == bv[key]) {
              ret.push(av)
            }
          })
      });
    return ret;
  }

  // 取回二個物件陣列的 無條件 合併結果
  getCombineAndCanRepeating(aany[], bany[]) {
    var retany[] = [];

    a.map(
      av => {
          ret.push(av);
      });

    b.map(
      bv => {
          ret.push(bv);
      });

      return ret;
  }

  // 取回二個物件陣列的 關鍵值不重複 合併結果
  getCombineAndNonRepeating(aany[], bany[], keystring) {
    var retany[] = [];

    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(dataany[], sortBystringfieldName?: string): any[] {
        let ret;
        switch (this.getArrayDataType(data0)) {
            case 'number':
                ret = (this.SortNumberArray(datasortBy));
                break;
            case 'string':
                ret = (this.SortStringArray(datasortBy));
                break;
            case 'object':
                ret = (this.SortObjectArray(datafieldNamesortBy));
                break;
            default:
                ret = data;
                break;
        }
        return ret.slice();
    }

    // 排序數值陣列
    // data: any[] 待排序的陣列資料
    // sortBy: string , 排序方式 up: 升冪 ,down: 降冪 
    private SortNumberArray(dataany[], sortBystring): any[] {
        let ret;
        if (data.length <= 0)
            return data;
        switch (sortBy) {
            case 'up':
                ret = data.sort((n1n2=> n1 - n2);
                break;
            case 'down':
                ret = data.sort((n1n2=> n2 - n1);
                break;
            default:
                ret = data;
                break;
        }
        return ret;
    }

    // 排序字串陣列
    // data: any[] 待排序的陣列資料
    // sortBy: string , 排序方式 up: 升冪 ,down: 降冪 
    private SortStringArray(dataany[], sortBystring): any[] {
        let ret;
        if (data.length <= 0)
            return data;
        switch (sortBy) {
            case 'up':
                ret = data.sort((ab=> a < b ? -1 : a > b ? 1 : 0);
                break;
            case 'down':
                ret = data.sort((ab=> 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(dataany[], fieldNamestringsortBystring): 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((o1o2=> o1[fieldName] < o2[fieldName] ? -1 : o1[fieldName] > o2[fieldName] ? 1 : 0);
                break;
            case 'down':
                ret = data.sort((o1o2=> 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(dataany[], indexnumber): string {
        if (data.length < index)
            return null;
        return (typeof data[index]);
    }













沒有留言:

張貼留言