@atachrus

Как удалить объект в многомерном массиве на основе значения ключа?

Подскажите как правильно найти объект в многомерно массиве, по ключу "id".
Как пройтись по всем children я понимаю (вынести обход в отдельную функцию), но как потом удалить именно мне нужный объект непонятно.

В примере я могу найти и удалить объект который в корне только лежит
Edit in JSFiddle

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": []
    }
]
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Функция принимает массив и функцию (типа как встроенные методы массива - 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 (let i = 0; i < arr.length; i++) {
      if (fn(arr[i], i, arr)) {
        numDeleted++;
      } else {
        arr[i - numDeleted] = arr[i];
        deleteNested(arr[i].children, fn);
      }
    }

    arr.length -= numDeleted;
  }
}

Использовать так:

deleteNested(itemsData, n => n.id === id_объекта_который_надо_удалить);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы