从JSON对象动态删除属性

时间:2018-05-17 13:51:47

标签: javascript arrays json redaction

我必须从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 :(得分:0)

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