Функция принимает массив и функцию (типа как встроенные методы массива -
map
,
filter
,
some
и т.д.), принимающую элемент массива и возвращающую
true
в случае, если элемент должен быть удалён. Если элемент удалять не надо, то следует обработать массив вложенных элементов - выполняется рекурсивный вызов. Как это может выглядеть:
function deleteNested(arr, fn) {
arr?.reduceRight?.((_, n, i, a) =>
fn(n, i, a)
? a.splice(i, 1)
: deleteNested(n.children, fn)
, null);
}
или
function deleteNested(arr, fn) {
if (Array.isArray(arr)) {
arr.splice(0, arr.length, ...arr.filter((n, i, a) => {
return !fn(n, i, a) && (deleteNested(n.children, fn), true);
}));
}
}
или
function deleteNested(arr, fn) {
if (arr instanceof Array) {
let numDeleted = 0;
for (const [ i, n ] of arr.entries()) {
if (fn(n, i, arr)) {
numDeleted++;
} else {
arr[i - numDeleted] = n;
deleteNested(n.children, fn);
}
}
arr.length -= numDeleted;
}
}
Использовать так:
deleteNested(itemsData, n => n.id === id_объекта_который_надо_удалить);