Как сделать удаление элементов объекта через 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 очень просто, как оказалось