50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
|
/**
|
||
|
* @author Martin Karkowski
|
||
|
* @email m.karkowski@zema.de
|
||
|
* @create date 2020-03-12 14:20:59
|
||
|
* @modify date 2020-04-09 09:07:38
|
||
|
* @desc [description]
|
||
|
*/
|
||
|
|
||
|
import { deepClone } from '../../../../lib/helpers/objectMethods';
|
||
|
import { IBaseNodeOptions } from '../interfaces/IBaseNodeOptions';
|
||
|
|
||
|
function recursiveExport<N extends IBaseNodeOptions>(
|
||
|
nodes: Array<N | IBaseNodeOptions>,
|
||
|
ret = new Array<N | IBaseNodeOptions>(),
|
||
|
parentIds = new Array<string>()
|
||
|
){
|
||
|
|
||
|
const indexesToRemove = new Array<number>();
|
||
|
|
||
|
nodes.map((node,idx) => {
|
||
|
if (parentIds.length == 0 && !node.parent){
|
||
|
indexesToRemove.push(idx);
|
||
|
ret.push(node)
|
||
|
} else if (parentIds.length > 0 && parentIds.includes(node.parent)) {
|
||
|
indexesToRemove.push(idx);
|
||
|
ret.push(node)
|
||
|
}
|
||
|
});
|
||
|
|
||
|
let removedElements = 0;
|
||
|
|
||
|
indexesToRemove.forEach(idx => {
|
||
|
const removed = nodes.splice(idx - removedElements, 1)[0];
|
||
|
removedElements += 1;
|
||
|
if (removed){
|
||
|
parentIds.push(removed.id);
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
if (nodes.length > 0){
|
||
|
recursiveExport(nodes, ret, parentIds)
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
export function sortNodes<N extends IBaseNodeOptions>(nodes: Array<N | IBaseNodeOptions>){
|
||
|
return recursiveExport(deepClone(nodes));
|
||
|
}
|