Мне нужно удалить объект или вложенный объект в массиве из заданного идентификатора объекта.
Объект, который необходимо удалить, может быть как корневым объектом в массиве, так и вложенным объектом (вариантв этом примере) в одном из корневых объектов.
Вот структура массива (и корневые объекты, и объекты вариантов имеют уникальные идентификаторы):
[
{ id: 1, title: 'object without variants', variants: [] },
{ id: 2, title: 'object with variants', variants: [{ id: 21, title: 'variant 1' }, { id: 22, title: 'variant 2' }]
]
Так, например, если передан идентификатор объектаиз события click, которое запускает функцию удаления 1, я хочу удалить весь корневой объект с идентификатором 1, а если объект, переданный из события click, равен 21, я хочу удалить только вариант с идентификатором 21 вкорневой объект с идентификатором 2, а не весь корневой объект.
Как это можно сделать?
ОБНОВЛЕНИЕ Я получил его с помощью этого кода (прошлоObjectIdидентификатор удаляемого объекта):
array = array.filter(object => object.id !== passedObjectId);
for (let object of array) {
object.variants = object.variants.filter(variant => variant.id !== passedObjectId);
}
Мне также нужно удалить корневой объект из массива, если последний вариант удален из объекта.
Код нижеработает,но могу ли я сделать это более красивым, не используя 3 метода filter ()?
array = array.filter(object => object.id !== passedObjectId);
for (let object of array) {
// Remove the variant from the root object
object.variants = object.variants.filter(variant => variant.id !== passedObjectId);
// Remove the root object, if there's no variants left in it
if (!object.variants.length) {
array = array.filter(object => object.id !== passedObjectId);
}
}
ДРУГОЕ ОБНОВЛЕНИЕ
В итоге я использовал этот код, который также удаляеткорневой объект, если удален последний вариант:
array = array.filter(object => {
const hasRemovedVariant = object.variants.some(variant => variant.id === passedObjectId);
if (hasRemovedVariant) {
object.variants = object.variants.filter(variant => variant.id !== passedObjectId);
return object.variants.length;
}
return object.id !== passedObjectId;
});