Удаление объекта из вложенного массива, если вы знаете указанное c местоположение, javascript - PullRequest
0 голосов
/ 24 марта 2020

У меня есть вложенный массив объектов. Что-то вроде:

[
  {
    item: 'x',
    data: [
      item: 'y',
      data: [
        item: 'z',
        data: [...]
      ]
    ],
    ...
  }
]

Я знаю, что элемент, который я хочу удалить, находится в позиции [1, 3, 1, 4]. Есть ли более быстрый способ удалить этот элемент в массиве?

1 Ответ

2 голосов
/ 24 марта 2020

Вот пример того, как я бы это сделал. Я извлекаю указатель на тот самый массив для изменения, а затем изменяю его.

Чего этот код не делает:

  • Не обрабатывает случай, данный неверное значение (плохие индексы)
  • Ключи не существуют

Что делает этот код:

  • Обрабатывать случай, когда мы удаляем первый предмет или глубокий предмет
  • Обрабатывать 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);
...