簡體   English   中英

遍歷子對象並使用 javascript 獲取所有值

[英]Iterate through the child objects and get all the values with javascript

var formmd = {
  "frmType": "Registration",
  "frmStage": "step1-complete",
  "formattr": {
    "SystemUser": {
      "LoginName": "A@test.com",
      "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": "9876543210",
      "PrimaryPhoneIndicator": null,
      "AllowVoicemail": false
    },

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

    }
  }

我正在嘗試獲取 formattr 下子對象的所有值,但我無法在子對象內部進行迭代。 以下是我試過的腳本。 我的結果應該是

"A@test.com"
"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");
                }           
            }               
        }           
    }
}

如何以自動方式訪問子對象的鍵?

像這樣嘗試

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

您可能會發現以函數式風格編寫的代碼更容易理解。 這是一種解決方案,我將解釋:

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

第一個表達式Object.values(formmd.formattr)為您提供Object.values(formmd.formattr)下所有值(不是鍵)的formmd.formattr 就像是:

[{"LoginName": "A@test.com", "Password": "password", …}, {"AddressLine1": "201 MOUNT Road", "AddressLine2": null, …}, …]

由於您需要這些子對象中的每一個中的值,因此下一行.map(obj => Object.values(obj))將做到這一點。 它返回一個新數組,其中輸入數組中的每個對象都通過Object.values(…) 它返回如下內容:

[["A@test.com", "password", "", false], ["201 MOUNT Road", null, "1", …], …]

該數組包含您需要的所有數據,但在嵌套數組中,因此需要使用.reduce((acc, vals) => acc.concat(vals), []) 這個reduce將連續concat這些子數組以產生一個單一的數組,如:

["A@test.com", "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)))

你將不得不使用Object.entries()

Object.entries() 方法返回給定對象自己的可枚舉字符串鍵控屬性 [key, value] 對的數組,其順序與 for...in 循環提供的順序相同。 (唯一重要的區別是 for...in 循環也枚舉原型鏈中的屬性)。

例子 -

for (const [key, value] of Object.entries(objectName)) {
  console.log(`${key}: ${value}`);
}

代碼片段 -

 var formmd = { "frmType": "Registration", "frmStage": "step1-complete", "formattr": { "SystemUser": { "LoginName": "A@test.com", "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": "9876543210", "PrimaryPhoneIndicator": null, "AllowVoicemail": false }, "PhysicianSpecialty": { "SpecialtyList": [ "1", "2" ] }, } } for (const [key, value] of Object.entries(formmd.formattr)) { console.log('Value',value); }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM