У меня есть рекурсивная функция, которая удаляет элемент по id, также, если этот элемент вложен в дочерний массив, он переместит его на один уровень вверх, это в основном своего рода структура меню.Когда элемент удаляется, дети не выбрасываются, а остаются в исходном объекте.
Теперь это принимает параметр 'data' и манипулирует им, но Мне интересно, если этоможно преобразовать это в функцию, которая возвращает новый массив, сохраняя неизменность аргумента?
Это функция
function removeId(data, id, parent = null) {
data.forEach((o, i) => {
if (o.id && o.id === id) {
if (parent) {
o.children.forEach(c => parent.children.push(c));
}
data.splice(i, 1);
return true;
} else if (o.children) {
removeId(o.children, id, o);
}
});
}
Это используемые тестовые данные
const data = [
{
id: 2,
children: [
{
id: 1,
children: []
}
]
},
{
id: 3,
children: [],
}
]
Функция вызывается следующим образом
data = removeId(data, itemIdToDelete)
Ожидаемый результат - новый (неизменяемый) массив со структурой предыдущего, кроме удаленных элементов (вложенных)
Это ожидаемый результат после запуска метода и передачи идентификатора 2, который будет удален
const data = [
{
id: 1,
children: []
},
{
id: 3,
children: [],
}
]
Я пробовал
- Преобразованиефункция с использованием Array.reduce () или Array.filter (), но она нарушает рекурсивность и возвращает неопределенное значение каждый раз.
Редактировать: Это не просто проблема глубокого клонирования, здесь есть логика, дляпример проверки, если родительесть дети.