base-ui
Version:
A component library for Better Vue developmemt
106 lines (84 loc) • 2.94 kB
JavaScript
/**
* @author lany44
* @date 2018/4/2-上午11:27
* @file util
*/
const PreOrder = 'PreOrder';
const PostOrder = 'PostOrder';
const genTraverseTreeListFunc = order => (treeList, handle) => {
const rec = (node) => {
if (order === PreOrder) handle(node);
if (node.children && node.children.length > 0) {
node.children.forEach(element => rec(element));
}
if (order === PostOrder) handle(node);
};
treeList.forEach(node => rec(node));
return treeList;
};
export const preOrderTreeList = genTraverseTreeListFunc(PreOrder);
export const postOrderTreeList = genTraverseTreeListFunc(PostOrder);
export const isTreeListAllFold = (treeList, foldDeep = 1) => {
const allFold = [];
treeList.forEach((treeNode) => {
let nodeisAllFold = true;
postOrderTreeList([treeNode], (node) => {
// 只检查最外层是否折叠
if (node.$$deep < foldDeep && node.$$isFold) nodeisAllFold = true;
if (node.$$deep === foldDeep) {
if (node.$$isFold || node.children.length === 0) return;
nodeisAllFold = false;
}
});
allFold.push(nodeisAllFold);
});
return allFold.every(item => item);
};
export const toggleNodeFoldStates = (treeList, isAllFold, unFoldDeep, foldDeep) => {
preOrderTreeList(treeList, (node) => {
if (isAllFold) {
// 展开
if (node.$$deep >= unFoldDeep) return;
node.$$isFold = !isAllFold;
} else {
// 收起
if (node.$$deep < foldDeep) return;
node.$$isFold = !isAllFold;
}
});
};
export const checkTreeListHasNode = (treeList, targetNode) => {
let isTreeListHasNode = false;
const rec = (node) => {
if (node === targetNode) {
isTreeListHasNode = true;
return;
}
if (node.children && node.children.length > 0) {
node.children.forEach(element => rec(element));
}
};
treeList.forEach(node => rec(node));
return isTreeListHasNode;
};
// https://stackoverflow.com/questions/40291987/javascript-deep-clone-object-with-circular-references
const deepClone = (obj, hash) => {
// Do not try to clone primitives or functions
if (Object(obj) !== obj || obj instanceof Function) return obj;
if (hash.has(obj)) return hash.get(obj);
let result;
try {
result = new obj.constructor();
} catch (error) {
result = Object.create(Object.getPrototypeOf(obj));
}
hash.set(obj, result);
return Object.assign(result, ...Object.keys(obj).map(key => ({[key]: deepClone(obj[key], hash)})));
};
export const cloneTreeList = (treeList) => {
const copyList = [];
const hash = new WeakMap();
hash.set(treeList, copyList);
treeList.forEach(tree => copyList.push(deepClone(tree, hash)));
return copyList;
};