Задать вопрос
@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": []
    }
]
  • Вопрос задан
  • 168 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

function deleteFromTree(tree, fn) {
  if (Array.isArray(tree)) {
    tree.length -= tree.reduce((acc, n, i, a) => (
      a[i - acc] = n,
      acc + !!(fn(n) || deleteFromTree(n.children, fn))
    ), 0);
  }
}

Рекурсии нет:

const deleteFromTree = function(tree, fn) {
  const stack = [];

  for (
    let [ arr, i, numDeleted ] = this(tree);
    ++i <= arr.length || stack.length;
  ) {
    if (i === arr.length) {
      arr.length -= numDeleted;
      [ arr, i, numDeleted ] = stack.pop() ?? [[]];
    } else if (fn(arr[i])) {
      numDeleted++;
    } else {
      arr[i - numDeleted] = arr[i];
      stack.push([ arr, i, numDeleted ]);
      [ arr, i, numDeleted ] = this(arr[i].children);
    }
  }
}.bind(x => [ x instanceof Array ? x : [], -1, 0 ]);

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

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

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

Похожие вопросы