我从API获取JSON结构,我希望在前端进行更改。前端为JSON结构添加了一个属性“isHidden”。当我发送修改后的JSON时,我不希望将具有“isHidden”的对象发送回API,但我仍然会在我自己的mongodb内部保存它。
但是,这样做比我想的要难得多。我做了这个功能,但我认为非常难看:
function removeHiddenObject(data,parent){
for(var property in data){
if(data.hasOwnProperty(property)){
if(property == "isHidden" && data[property] === true){
parent.splice(parent.indexOf(data), 1);
}
else {
if(typeof data[property] === "object") {
removeHiddenObject(data[property], data);
}
}
}
}
return data;
}
这是一种递归方法,但我发现它复杂而奇怪。有没有办法简化我的任务?
如果您想提供帮助,这里有一个jsfiddle:https://jsfiddle.net/vn4vbne8/
答案 0 :(得分:1)
使用此代码将其从json字符串中删除:
myJson=s.replace(/,*\s*"[^"]"\s*\:\s*{(.*?)"isHidden"\:([^}]*)}/gm,"");
在Regex中要小心,每个字符都很重要,所以请使用上面的代码。 它删除了具有其属性之一为isHidden的对象的每个属性。
答案 1 :(得分:1)
Javascript实际上支持不可枚举的公共属性。我假设当您将数据发送回服务器时,首先使用JSON.stringify
对其进行字符串化,这只会对对象的公共可枚举属性进行字符串化。
您可以定义这样的非可枚举属性(此here上的更多内容):
Object.defineProperty(obj, 'isHidden', {
enumerable: false,
writable: true
});
其中obj
是要添加属性的javascript对象,isHidden
是要添加的属性的名称。完成此操作后,新属性可以obj.isHidden
访问,但不会显示在JSON.stringify
输出中,也不会显示在for
循环中。