Динамическое удаление свойства из объекта JSON
Я должен удалить свойства из объекта JSON. Как будто мне нужно написать фреймворк, в котором я передаю массив местоположений, откуда поля должны быть отредактированы. Мой запрос JSON выглядит так
{
"name": "Rohit",
"other": [{
"tfn": "2879872934"
}, {
"tfn": "3545345345"
}],
"other1": {
"tfn": "3545345345"
},
"other2": {
"other3": [{
"tf2n": "2879872934"
}, {
"tfn": "3545345345"
}, {
"tfn": "2342342234"
}]
},
"card": "sdlkjl",
"tfn": "2879872934",
"f": true}
Как я уже говорил выше, это то, как я захватил места, которые нужно удалить
let paths = ['other.tfn','tfn','other1.tfn','other2.other3.tfn'];
Это удаляет поля TFN почти из всех мест и возвращает
{
"name": "Rohit",
"other": [
{},
{}
],
"other1": {},
"other2": {
"other3": [
{
"tf2n": "2879872934"
},
{},
{}
]
},
"card": "sdlkjl",
"f": true}
Мне интересно, если кто-то может предложить лучший способ написать код ниже
paths.forEach(function (path) {
let keys = path.split('.');
deepObjectRemove(jsonObject, keys);
});
метод
var deepObjectRemove = function(obj, path_to_key){
if(path_to_key.length === 1){
delete obj[path_to_key[0]];
return true;
}else{
if(obj[path_to_key[0]] && Array.isArray(obj[path_to_key[0]])) {
obj[path_to_key[0]].forEach(function (value) {
deepObjectRemove(value, path_to_key.slice(1));
});
//return deepObjectRemove(obj[path_to_key[0]], path_to_key.slice(1));
}else if(obj[path_to_key[0]]){
deepObjectRemove(obj[path_to_key[0]], path_to_key.slice(1));
}else{
return false;
}
}};
1 ответ
function deepObjectRemove(object, path) {
const parts = path.split(".");
let current;
while (current = parts.shift()) {
if (!object) {
return;
}
const item = object[current];
if (item !== undefined) {
if (!parts.length) {
delete object[current];
}
if (item instanceof Array) {
return item.forEach((item) => deepObjectRemove(item, parts.join(".")));
}
}
object = item;
}
}
const object = {
a: {
b: {
c: "1",
d: 0
}
},
b: [
{
a: {
b: "0",
c: "1"
}
},
{
a: {
b: "0",
c: "1"
}
}
]
};
console.log("before", object);
[
"a.b.c",
"b.a.c"
].forEach((path) => deepObjectRemove(object, path));
console.log("after", object);