[英]JavaScript | Iterate through JSON Object and get all the values for a specific key
[英]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]);
}
}
}
您可能会发现以函数式风格编写的代码更容易理解。 这是一种解决方案,我将解释:
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.