let itemsData = [
{
"id": 0,
"text": "item1",
"children": []
},
{
"id": 1,
"text": "item2",
"children": [
{
"id": 2,
"text": "item2-1",
"children": []
},
{
"id": 5,
"text": "item2-2",
"children": [
{
"id": 112,
"text": "item2-2-1",
"pageId": "4",
"children": []
}
]
},
{
"id": 4,
"text": "item2-3",
"children": []
}
]
},
{
"id": 3,
"text": "item3",
"children": []
}
]
function deleteFromTree(tree, fn) {
if (Array.isArray(tree)) {
tree.length -= tree.reduce((acc, n, i, a) => (
a[i - acc] = n,
acc + !!(fn(n) || deleteFromTree(n.children, fn))
), 0);
}
}
const deleteFromTree = function(tree, fn) {
const stack = [];
for (
let [ arr, i, numDeleted ] = this(tree);
++i <= arr.length || stack.length;
) {
if (i === arr.length) {
arr.length -= numDeleted;
[ arr, i, numDeleted ] = stack.pop() ?? [[]];
} else if (fn(arr[i])) {
numDeleted++;
} else {
arr[i - numDeleted] = arr[i];
stack.push([ arr, i, numDeleted ]);
[ arr, i, numDeleted ] = this(arr[i].children);
}
}
}.bind(x => [ x instanceof Array ? x : [], -1, 0 ]);
deleteFromTree(itemsData, n => n.id === id_объекта_который_надо_удалить);