mock-util.js
3.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
const mockUtil = {
// 通用分页查询方法
query(data, param) {
data = data || [];
param = param || {};
let tmpAry = [...data];
if (param.querys) {
const group = param.querys.groupByKey("group");
// 每一个分组所对应的查询结果集(二维数组)
let ary4group = [];
Object.keys(group).forEach(g => {
let tmp = [...data];
const qs = group[g];
// 同一组查询条件只取第一个条件中的relation作为当前组的组合关系
const relation = qs[0]["relation"];
// AND类型的组合,每一个查询条件在上一次过滤的结果集中再次过滤
if (relation == 'AND') {
qs.forEach(q => {
tmp = this._query4operation(q, tmp);
});
ary4group.push(tmp);
}
// OR类型的组合,每一个查询条件得到单独的过滤结果集,最后将结果集合并去重
else if (relation == 'OR') {
let ary4query = [];
qs.forEach(q => {
const r = this._query4operation(q, tmp);
// 合并
ary4query = ary4query.concat(r);
});
// 去重
ary4query.unique();
ary4group.push(ary4query);
}
else {
throw `当前传入的relation是${relation},只能是'AND'或'OR'`;
}
});
// 取多个分组的查询结果集的交集
tmpAry = this._mixArray(ary4group);
}
// 排序(仅支持一个排序字段)
if (param.sorter) {
const sort = param.sorter[0];
const directDic = ['ASC', 'DESC'];
if (directDic.indexOf(sort.direction) == -1) {
throw `不支持排序方向${sort.direction},仅支持${directDic}`;
}
const isASC = sort.direction == 'ASC';
tmpAry.sort((pre, after) => {
return pre[sort.property] > after[sort.property] ? (isASC ? 1 : -1) : (isASC ? -1 : 1);
});
}
// 分页
if (param.pageBean) {
const rows = tmpAry.slice((param.pageBean.page - 1) * param.pageBean.pageSize, param.pageBean.page * param.pageBean.pageSize);
return { rows, page: param.pageBean.page, pageSize: param.pageBean.pageSize, total: tmpAry.length };
}
else {
return { rows };
}
},
// 根据不同的查询条件进行过滤
_query4operation(query, ary) {
const operation = query.operation;
const permitOperations = ['equal', 'like', 'in'];
if (permitOperations.indexOf(operation) == -1) {
throw `查询条件不支持${operation},仅支持${permitOperations}`;
}
let result = [];
switch (operation) {
case 'equal':
result = ary.filter(m => query.value === m[query.property]);
break;
case 'like':
result = ary.filter(m => m[query.property].indexOf(query.value) > -1);
break;
case 'in':
result = ary.filter(m => query.value.indexOf(m[query.property]) > -1);
break;
}
return result;
},
// 多个数组之间取交集
_mixArray(ary4group) {
ary4group = ary4group || [];
let result = [];
ary4group.forEach((ary, index) => {
if (index == 0) {
result = [...ary];
}
else {
const set1 = new Set(result),
set2 = new Set(ary);
result = [...new Set([...set1].filter(x => set2.has(x)))];
}
});
return result;
}
}
export default mockUtil;