Динамическое удаление свойства из объекта JSON - PullRequest
0 голосов
/ 17 мая 2018

Мне нужно удалить свойства из объекта 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 Ответ

0 голосов
/ 17 мая 2018

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);
...