107 lines
3.1 KiB
TypeScript
107 lines
3.1 KiB
TypeScript
![]() |
import { Staff } from "@prisma/client";
|
|||
|
import { DataNode } from "./type";
|
|||
|
export function findNodeByKey(
|
|||
|
nodes: DataNode[],
|
|||
|
targetKey: string
|
|||
|
): DataNode | null {
|
|||
|
let result: DataNode | null = null;
|
|||
|
|
|||
|
for (const node of nodes) {
|
|||
|
if (node.key === targetKey) {
|
|||
|
return node;
|
|||
|
}
|
|||
|
|
|||
|
if (node.children && node.children.length > 0) {
|
|||
|
result = findNodeByKey(node.children, targetKey);
|
|||
|
if (result) {
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
export function findStaffById(
|
|||
|
nodes: DataNode[],
|
|||
|
staffId: string
|
|||
|
): Staff | null {
|
|||
|
for (const node of nodes) {
|
|||
|
// 在当前节点的staffs数组中查找
|
|||
|
const foundStaff = node?.data?.staffs.find(
|
|||
|
(staff: Staff) => staff.id === staffId
|
|||
|
);
|
|||
|
if (foundStaff) {
|
|||
|
return foundStaff;
|
|||
|
}
|
|||
|
|
|||
|
// 如果当前节点的staffs数组中没有找到,则递归在子节点中查找
|
|||
|
if (node.children) {
|
|||
|
const foundInChildren = findStaffById(node.children, staffId);
|
|||
|
if (foundInChildren) {
|
|||
|
return foundInChildren;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 如果在所有节点及其子节点中都没有找到,返回null
|
|||
|
return null;
|
|||
|
}
|
|||
|
interface MappingConfig {
|
|||
|
titleField?: string;
|
|||
|
keyField?: string;
|
|||
|
valueField?: string;
|
|||
|
hasChildrenField?: string; // Optional, in case the structure has nested items
|
|||
|
childrenField?: string;
|
|||
|
}
|
|||
|
|
|||
|
export function mapToDataNodes(
|
|||
|
inputArray: any[],
|
|||
|
config: MappingConfig = {}
|
|||
|
): DataNode[] {
|
|||
|
const {
|
|||
|
titleField = "title",
|
|||
|
keyField = "key",
|
|||
|
valueField = "value",
|
|||
|
hasChildrenField = "hasChildren",
|
|||
|
childrenField = "children"
|
|||
|
} = config;
|
|||
|
|
|||
|
return inputArray.map((item) => {
|
|||
|
const hasChildren = item[hasChildrenField] || false;
|
|||
|
const children = item[childrenField]
|
|||
|
return {
|
|||
|
title: item[titleField] || "",
|
|||
|
key: item[keyField] || "",
|
|||
|
value: item[valueField] || null,
|
|||
|
data: item,
|
|||
|
children: children
|
|||
|
? mapToDataNodes(children, { titleField, keyField, valueField, hasChildrenField, childrenField })
|
|||
|
: undefined,
|
|||
|
hasChildren
|
|||
|
};
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 合并两个数组并去重。
|
|||
|
*
|
|||
|
* 该函数将两个输入数组的元素合并为一个数组,
|
|||
|
* 并确保结果数组中没有重复的元素。元素的顺序根据它们首次出现的顺序保留。
|
|||
|
*
|
|||
|
* @template T - 输入数组中元素的类型。
|
|||
|
* @param {T[]} array1 - 要合并的第一个数组。
|
|||
|
* @param {T[]} array2 - 要合并的第二个数组。
|
|||
|
* @returns {T[]} 包含来自两个输入数组的唯一元素的新数组。
|
|||
|
*
|
|||
|
* @example
|
|||
|
* const array1 = [1, 2, 3, 4];
|
|||
|
* const array2 = [3, 4, 5, 6];
|
|||
|
* const result = mergeAndDeduplicate(array1, array2);
|
|||
|
* console.log(result); // 输出: [1, 2, 3, 4, 5, 6]
|
|||
|
*/
|
|||
|
export function mergeAndDeduplicate<T = string>(array1: T[], array2: T[]): T[] {
|
|||
|
const set = new Set([...array1, ...array2]);
|
|||
|
return Array.from(set);
|
|||
|
}
|
|||
|
|