6c39ac3538
* refactor: fields/views/pages... * update * update * update * updates * updates * add yarn.lock * updates * updates * updates * updates * updates * updates * updates * updates * updates * developerMode * 一大波更新 * bugfix * fix: hide the sorting settings * fix: reload menu when menu is updated * 页面重构 * modify text * 补充细节 * system settings * 继续更新补充 * fix: 多级菜单支持 * 无限嵌套 * fix: icon * 省市区参数调整 * 表单描述、文案调整 * 支持草稿 * 邮箱登录 * 细节补充 * 菜单页面权限初步 * 详情页打开方式 * 菜单父级、草稿问题 * 描述文字 * 详情分组显示 * 状态改为 radio * 菜单权限 * 跳过省市区 api * 修复权限数据范围 * onDraft * 页面跳转 * 修改文案 * 注册、登录 * fix: 权限过滤问题 * 微调上传组件样式 * 0.4.0-alpha.0 * father-build * remove father-build * 细节调整
47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import deepmerge from 'deepmerge';
|
|
|
|
export const flatToTree = (flatArray, options) => {
|
|
options = {
|
|
id: "id",
|
|
parentId: "parentId",
|
|
children: "children",
|
|
...options
|
|
};
|
|
const dictionary = {}; // a hash table mapping to the specific array objects with their ids as key
|
|
const tree = [];
|
|
const children = options.children;
|
|
flatArray.forEach(node => {
|
|
const nodeId = node[options.id];
|
|
const nodeParentId = node[options.parentId];
|
|
// set up current node data in dictionary
|
|
dictionary[nodeId] = {
|
|
[children]: [], // init a children property
|
|
...node, // add other propertys
|
|
...dictionary[nodeId] // children will be replaced if this node already has children property which was set below
|
|
};
|
|
dictionary[nodeParentId] = dictionary[nodeParentId] || { [children]: [] }; // if it's not exist in dictionary, init an object with children property
|
|
dictionary[nodeParentId][children].push(dictionary[nodeId]); // add reference to current node object in parent node object
|
|
});
|
|
// find root nodes
|
|
Object.values(dictionary).forEach(obj => {
|
|
if (typeof obj[options.id] === "undefined") {
|
|
tree.push(...obj[children]);
|
|
}
|
|
});
|
|
return treeData(tree);
|
|
};
|
|
|
|
function treeData(pages: Array<any>) {
|
|
return pages.map(data => {
|
|
return {...data, children: data.children && data.children.length ? treeData(data.children) : undefined}
|
|
});
|
|
}
|
|
|
|
const overwriteMerge = (destinationArray, sourceArray, options) => sourceArray
|
|
|
|
export function merge(obj1: any, obj2: any) {
|
|
return deepmerge(obj1, obj2, {
|
|
arrayMerge: overwriteMerge,
|
|
});
|
|
}
|