一些处理表格数据composition api
# 一些处理表格数据composition api
# 检查表格某列是否重复,并返回重复的值
export const useTableColDuplicate = <Data>(tableData?: Data[] | Ref<Data[]>, key?: keyof Data) => {
const valueTemp = ref(new Set<Data[keyof Data]>());
const duplicateValues = computed(() => Array.from(valueTemp.value));
const isDuplicate = computed(() => !!duplicateValues.value.length);
watch(() => tableData, (val) => {
if (!val || !key) {
return;
}
valueTemp.value.clear();
const data = isRef(val) ? val.value : val;
const values = data.map((i) => i[key]);
values.forEach((value) => {
if (values.lastIndexOf(value) !== values.indexOf(value)) {
valueTemp.value.add(value);
}
});
}, {
deep: true,
});
return {
isDuplicate,
duplicateValues,
};
};
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 将层级为2的树展开成表格
const shallowTreeTableMap = new WeakMap();
export const useShallowTreeTable = <Data extends Record<string, unknown>, ChildKey extends keyof Data>(tree: Data[], childKey: ChildKey) => {
type Child = (Data[ChildKey] & any[])[number]
type TreeChildKey = Extract<keyof Child, string>
type TableChildKey = `childTable_${TreeChildKey}`
type TableRow = Record<TreeChildKey | TableChildKey | 'isMain', unknown>
const table = ref<TableRow[]>([]) as Ref<TableRow[]>;
if (!tree || !childKey) {
return table;
}
if (shallowTreeTableMap.has(tree)) {
return shallowTreeTableMap.get(tree) as typeof table;
}
shallowTreeTableMap.set(tree, table);
let tableEdit = false;
let treeEdit = false;
watch(() => tree, (value) => {
if (treeEdit) {
treeEdit = false;
return;
}
const list: TableRow[] = [];
if (!value || !childKey) {
return;
}
value?.forEach((parent) => {
const children = parent[childKey];
if (!Array.isArray(children)) return;
children?.forEach((child, index) => {
list.push({
...parent,
isMain: index === 0,
...Object.fromEntries(Object.entries(child).map(([key, value]) => [`childTable_${key}`, value])),
});
});
});
tableEdit = true;
table.value = list;
}, {
immediate: true,
deep: true,
});
watch(table, (value) => {
if (tableEdit) {
tableEdit = false;
return;
}
const list: Data[] = [];
if (!value || !childKey) return;
let current: (typeof list)[number];
value.forEach((rowDetail) => {
const { isMain, ...row } = rowDetail;
const subList = Object.fromEntries(Object.entries(row).filter(
([key]) => key.startsWith('childTable_'),
).map(
([key, value]) => ([key.replace('childTable_', ''), value]),
)) as Record<TreeChildKey, unknown>;
const raw = Object.fromEntries(Object.entries(row).filter(([key]) => !key.startsWith('childTable_'))) as Data;
if (isMain) {
current = raw;
raw[childKey] = [subList] as Data[ChildKey];
list.push(raw);
} else {
(current?.[childKey] as (typeof subList)[])?.push(subList);
}
});
treeEdit = true;
tree.splice(0, tree.length, ...list);
}, {
deep: true,
});
return table;
};
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
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
上次更新: 2023/06/01, 12:40:50