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

К примеру, есть словарь

let object = { 'a': [{ 'b': { 'c': 3 } }] };

И путь к удалению

let path = 'a[0].b.c';

Нужно сделать функцию типа

const deleteObj = (obj, path) => {}

чтобы результат на выводе был таким:

{ 'a': [{ 'b': {} }] }

Должно работать с любым уровнем вложенности


Ответы (3 шт):

Автор решения: highpassion

Вы можете попробовать оба метода, однако это небезопасно.

Почему не стоит переводить строку в выражение описано здесь

1:

let obj = {"a" : [ {b: {c: 3} } ] },

path = 'obj["a"][0].b',

exp = new Function('return ' + path); 
function convert(e) {
  return e();
};

function deleteProp (o, b) {
    for (let key in b) {
       delete b[key];
    }
}

deleteProp(obj, convert(exp));

2:

let obj = {"a" : [ {b: {c: 3} } ] },
path = eval('obj["a"][0].b');

function deleteProp (o, b) {
  for (let key in b) {
     delete b[key];
  }
}

deleteProp(obj, path);
→ Ссылка
Автор решения: Андрей NOP

Безопасный вариант с разбором пути:

function deleteProp(obj, path) {
  if (!/^(\w+)(?:\[(\w+)\]|\.(\w+))*$/.test(path)) {
    throw "Invalid path!";
  }
  
  const parts = path.replace(/\[(\w+)\]/g, '.$1').split('.');
  const lastPart = parts.pop();
  let prop = obj;
  for (const part of parts) {
    prop = prop[part];
    
    if (prop === undefined) {
        throw "Path does not exist!";
    }
  }
  
  const deleted = prop[lastPart];
  delete prop[lastPart];
  return deleted;
}

const object = { 'a': [{ 'b': [5, { 'c': 3 }] }] };
const path = 'a[0].b[1].c';
const deleted = deleteProp(object, path);
console.log(deleted);
console.log(object);

→ Ссылка
Автор решения: nikolay35977
const deleteSubProp = (data, path) => {
let newData = {...data},
    child,
    parents = path.replace(/\[(\w+)\]$/, '.$1').split('.');
child = parents.pop();
parents = parents.join('.');
delete _.get(newData, parents)[child];}

Делается при помощи lodash очень просто, как оказалось

→ Ссылка