繁体   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