I am reordering the nodes in a certain level for a tree structure using the following recursive function. Reorder using the sort is not taking time, however recursively finding the parent node is taking time. how can I make this faster?
const reorderNodes = (tree, reorderedObject) => {
let copy = cloneDeep(tree);
// reorder
const reorder = (children) =>
children?.slice().sort((a, b) => {
return (
reorderedObject.children.findIndex(reordered => reordered.id === a.id) -
reorderedObject.children.findIndex(reordered => reordered.id === b.id)
);
});
if (!reorderedObject.parentId) {
// if no parent
copy = reorder(copy);
} else {
// look recursively
copy = copy.map(el => {
// found element to reorder.
if (el.children) {
if (el.id === reorderedObject.parentId) {
el.children = reorder(el.children);
} else {
el.children = reorderNodes(el.children, reorderedObject);
}
}
return el;
});
}
return copy;
};
tree data
const tree = [
{
id: 'module-1',
label: 'Unit',
children: [{ id: 'field-zz', label: 'Name' }]
},
{
id: 'module-2',
label: 'Plans',
children: [
{
id: 'level-1',
label: 'Test-Level-1',
children: [
{
id: 'level-1-1',
label: 'Test-Level-1-1',
children: [
{
id: 'field-1-1',
label: 'ID',
},
{
id: 'field-1-2',
label: 'First upd',
}
]
},
{
id: 'level-1-2',
label: 'Level-1-1-2',
children: [
{
id: 'field-2-1',
label: 'ID',
},
{
id: 'field-2-2',
label: 'First Upd',
}
]
}
]
},
{
id: 'level-2',
label: 'Test-Level-2',
children: [
{
id: 'field-3',
label: 'Keyword',
},
{
id: 'field-4',
label: 'Assignment',
}
]
},
{
id: 'module-3',
label: 'Find more',
children: [
{
id: 'field-5',
label: 'Description',
},
{
id: 'field-6',
label: 'ID',
}
]
}
]
},
{
id: 'module-4',
label: 'Data',
children: [
{ id: 'field-33333', label: 'Date'},
{ id: 'field-44444', label: 'Time'}
]
}
];
reorderedObject
const reorderedObject = {
parentid: 'module-4',
children: [
{ id: 'field-44444', label: 'Time'},
{ id: 'field-33333', label: 'Date'}
]
}
If i have 4 level depth and 50 items in each level, it takes 10 sec to process.