2017-02-28 101 views
1
var formmd = { 
    "frmType": "Registration", 
    "frmStage": "step1-complete", 
    "formattr": { 
    "SystemUser": { 
     "LoginName": "[email protected]", 
     "Password": "password", 
     "PIN": "", 
     "IsTestUser": false 
    }, 

    "ConsumerAddress": { 
     "AddressLine1": "201 MOUNT Road", 
     "AddressLine2": null, 
     "AddressTypeId": "1", 
     "City": "OLA TRAP", 
     "State": "NM", 
     "Zipcode": "60005" 
    }, 
    "ConsumerPhone": { 
     "PhoneTypeId": 6, 
     "PhoneNumber": "", 
     "PrimaryPhoneIndicator": null, 
     "AllowVoicemail": false 
    }, 

    "PhysicianSpecialty": { 
     "SpecialtyList": [ 
     "1", 
     "2" 
     ] 
    }, 

    } 
    } 

我想獲取formattr下的子對象的所有值,但我無法迭代子對象內。以下是我嘗試的腳本。 我的結果應該是迭代通過子對象,並獲取所有的值與JavaScript

"[email protected]" 
"password" 
"PIN": "" 
False 
201 MOUNT Road" 

我試過的腳本是

function walk(formmd) { 
    var obj1 = formmd.formattr; 

    for(var key in obj1){ 
     if (obj1.hasOwnProperty(key)) { 
      var val1 = obj1[key]; 

      if(val1.hasOwnProperty(key)){ 
      for(var key in val1){ 
       var val2 =val1[key]; 

       console.log("val2"); 
       }   
      }    
     }   
    } 
} 

如何訪問以自動化的方式子對象的鑰匙?

+1

提示:什麼是'如果(val1.hasOwnProperty(鍵)){'部分在做什麼? – nnnnnn

+0

兩次使用'key'似乎不是一個好主意。如果您真的想重新使用該變量名稱,請使用'let'而不是'var'來封鎖它的範圍。無論如何,爲了調試這個,爲什麼不用一個調試器遍歷它,在每一步中檢查變量值? – 2017-02-28 02:56:50

回答

1

嘗試這樣

for (var key in formmd) { 
    var val1 = formmd[key]; 
    if (key=="formattr") { 
    for (var key1 in val1) { 
     var val2 = val1[key1]; 
     for(var key2 in val2) 
     console.log(val2[key2]); 
    } 
    } 
} 

DEMO

0

您可能會發現更容易理解寫在一個函數式風格的代碼。這是一個解決方案,我將說明:

Object.values(formmd.formattr) 
    .map(obj => Object.values(obj)) 
    .reduce((acc, vals) => acc.concat(vals), []) 

第一表達Object.values(formmd.formattr)給你的所有值(未鍵)的formmd.formattr下的陣列。喜歡的東西:

[{"LoginName": "[email protected]", "Password": "password", …}, {"AddressLine1": "201 MOUNT Road", "AddressLine2": null, …}, …] 

既然你想在每個這些值的子對象的下一行.map(obj => Object.values(obj))將做到這一點。它返回一個新的數組,其中輸入數組中的每個對象都通過Object.values(…)轉換。它返回類似:

[["[email protected]", "password", "", false], ["201 MOUNT Road", null, "1", …], …] 

這個數組所有你後的數據,但在嵌套的數組,所以它需要與.reduce((acc, vals) => acc.concat(vals), [])被壓扁。此reduce將依次concat這些子陣列以生成一個單一的陣列,如:

["[email protected]", "password", "", false, "201 MOUNT Road", null, "1", …] 

含有formattr下的子對象的所有的值。


下面是一些其他的方式來做到這一點:

Object.values(formmd.formattr) 
    .reduce((acc, x) => acc.concat(Object.values(x)), []) 

[].concat(... 
    Object.values(formmd.formattr) 
     .map(obj => Object.values(obj)))