使用Javascript过滤json String

时间:2013-09-25 12:12:46

标签: javascript json

我正在开展一个小项目。 我坚持一个小js问题。 我有json字符串,如:

var jsObj = {
        "templates": {
            "form0": {
                "ID": "MyAlertNew",
                "isVisible": "true",
                "children": [
                    {
                        "-type": "kButton3",
                        "ID": "myButtonID1",
                        "isVisible": "true",
                        "onClick": "onClickMethod",
                        "paddings": {
                            "left": "0",
                            "right": "0",
                            "top": "3",
                            "bottom": "3",
                            "unit": "%"
                        },
                        "text": "dynamic text in file"
                    },
                    {
                        "-type": "kButton1",
                        "ID": "btnAlign2",
                        "visible": "true",
                        "margins": {
                            "left": "0",
                            "right": "0",
                            "top": "0",
                            "bottom": "0",
                            "unit": "%"
                        }
                    }

                ]
            },
            "form1": {
                "ID": "frmNewPOC1",
                "isVisible": "true",
                "children": [
                    {
                        "-type": "kButton3",
                        "ID": "btnAlign",
                        "isVisible": "true",
                        "onClick": "onClickMethod",
                        "paddings": {
                            "left": "0",
                            "right": "0",
                            "top": "3",
                            "bottom": "3",
                            "unit": "%"
                        },
                        "text": "in diff form"
                    },
                    {
                        "-type": "kButton1",
                        "ID": "btnAlignTest",
                        "visible": "true",
                        "margins": {
                            "left": "0",
                            "right": "0",
                            "top": "0",
                            "bottom": "0",
                            "unit": "%"
                        },
                        "text": "in My Form"
                    }  
                ]
            }
        }
    };

我想过滤它:

objnew ={
        "MyAlertNew":{
            "isVisible": "true"
        },
        "myButtonID1":{
            "isVisible": "true",
            "onClick": "onClickMethod",
            "paddings": {
                "left": "0",
                "right": "0",
                "top": "3",
                "bottom": "3",
                "unit": "%"
            },
            "text": "dynamic text in file"
        },
        "btnAlign2":{
            "visible": "true",
            "margins": {
                "left": "0",
                "right": "0",
                "top": "0",
                "bottom": "0",
                "unit": "%"
            }
        },
        "frmNewPOC1":{
            "isVisible": "true"
        },
        "btnAlign":{
            "isVisible": "true",
            "onClick": "onClickMethod",
            "paddings": {
                "left": "0",
                "right": "0",
                "top": "3",
                "bottom": "3",
                "unit": "%"
            },
            "text": "in diff form"
        },
        "btnAlignTest":{
            "visible": "true",
            "margins": {
                "left": "0",
                "right": "0",
                "top": "0",
                "bottom": "0",
                "unit": "%"
            },
            "text": "in My Form"
        }
    }

到目前为止,我已尝试使用以下代码,但我获得了成功。

   testObj = jsObj.templates;
        var idObj = [];
        var widgetProp =[];
        var ID ;
        function parseMyObj(testObj){
            for(x in testObj){

                if(typeof testObj[x] == "object"){
                    //widgetProp[]
                    parseMyObj(testObj[x]);
                }
                else if(x=='ID'){
                    ID = testObj[x];  
                    idObj.push(testObj[x]); 

                }
                else{
                    widgetProp.push(x:testObj[x]);
                }
            }
        }
        parseMyObj(testObj);
        console.log(widgetProp);
        console.log(JSON.stringify(idObj));

请事先帮助我。

1 个答案:

答案 0 :(得分:1)

嗯,一个简单的算法(假设密钥名称IDchildren不会改变)

  1. 创建一个空对象N
  2. 迭代O的键和值
    • 如果值是对象,请让O成为此对象,然后转到2.
    • 如果密钥为children,则对于每个孩子,让O成为孩子并转到2。
    • 如果密钥为ID
      1. name成为此密钥的值
      2. 创建一个空对象X
      3. O的所有键和值复制到XIDchildren.
      4. 将构建的对象分配给对象name
      5. 中的键N
  3. 这是上述算法的一个简单实现(尽管不灵活)。

    var createdFormattedObject = function(baseObject, formattedObject) {
      formattedObject = formattedObject || {};
    
      for(var key in baseObject) {
        if(!baseObject.hasOwnProperty(key)) {
          continue;
        }
        var value = baseObject[key];
    
        if(key === "ID") {
          formattedObject[value] = {};
          for(var k in baseObject) {
            if(k !== "ID" && k !== "children") {
              formattedObject[value][k] = baseObject[k];
            }
          }
        } else if(key === "children") {
          for(var i = 0; i < value.length; i++) {
            createdFormattedObject(value[i], formattedObject);
          }
        } else if(value instanceof Object) {
          createdFormattedObject(value, formattedObject);
        }
      }
    
      return formattedObject;
    };
    

    请注意,第二个参数仅对递归有用,在调用函数时不是必需的。