Вот пример того, как я бы это сделал. Я извлекаю указатель на тот самый массив для изменения, а затем изменяю его.
Чего этот код не делает:
- Не обрабатывает случай, данный неверное значение (плохие индексы)
- Ключи не существуют
Что делает этот код:
- Обрабатывать случай, когда мы удаляем первый предмет или глубокий предмет
- Обрабатывать X вложенных уровней
- видоизменять данный объект
const arr = [{
item: 'x',
data: [{
item: 'y',
data: [{
item: 'z',
data: [],
}],
},
{
item: 'y2',
data: [{
item: 'z',
data: [{
item: 'a',
data: [],
}, {
item: 'b',
data: [],
}, {
item: 'toRemove',
data: [],
}],
}],
}, {
item: 'y3',
data: [{
item: 'z',
data: [],
}],
},
],
}];
// /!\ Mutate the given object
function removeAtPos(obj, pos) {
// Because we look for a pointer, we dont go all in
// or we would mutate a copy of the data and not the given object data
const allExceptLast = pos.slice(0, pos.length - 1);
// ternary is here to handle the case if we have the first item or not
// First item doesn't start with 'data'
const ptr = allExceptLast.reduce((tmp, x) => tmp.data ?
tmp.data[x] :
tmp[x], obj);
// Finally remove the wanted part of the array
(ptr.data || ptr).splice(pos[pos.length - 1], 1);
}
removeAtPos(arr, [0, 1, 0, 2]);
console.log(arr);