如果JSON具有某些属性,则删除它的父对象

时间:2016-01-26 12:37:47

标签: javascript json recursion

我从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/

2 个答案:

答案 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循环中。