2013-09-25 92 views
0

我正在處理一個小項目。 我堅持一個小js問題。 我有JSON字符串,如:使用Javascript過濾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" 
     } 
    } 

到目前爲止,我有下面的代碼嘗試,但我得到的DIN成功。

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

'parse'不是這個函數的正確詞。解析通常意味着您正在應用某種狀態機將純文本轉換爲結構。 「轉化」將是一個更好的術語。 – Halcyon

+0

@Frits van Campen好的,我會改變它的感謝。你有解決我的問題嗎? –

回答

1

好了,一個簡單的算法(假設鍵值名IDchildren不會改變)

  1. 上的O
    • 如果鍵和值創建一個空的對象N
    • 迭代值是一個對象,則讓O成爲此對象並轉至2.
    • 如果密鑰爲children,則對於每個孩子讓O是孩子,去2
    • 如果關鍵是ID
      1. name是值這個關鍵
      2. 創建一個空的對象X
      3. 複製所有關鍵和OX除了IDchildren.
      4. 分配內置對象的關鍵name在你的對象N

下面是一個簡單的實現(根本沒有靈活性)的上述算法。

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

請注意,第二個參數僅用於遞歸,在調用該函數時不需要。