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]);
}
沒有留言:
張貼留言