javascript - 使用 Angular 6 循环遍历复杂的 JSON 对象
问题描述
我有一个 JSON 对象,我只对其中一个关键“代码”及其值感兴趣。我想运行一个循环来获取每个地区、国家和城市的这些值,并将它们存储在一个数组中。
{
"region":{
"America":{
"countries":{
"US":{
"cities":{
"NY":{
"codes":["142","2243","312","4123","5132"]
},
"LA":{
"codes":["1465","2465","3453","4132","542"]
}
}
},
"CANADA":{
"cities":{
"TORNTO":{
"codes":["1465","2465","3453","4132","542"]
}
}
}
}
},
"ASIA":{
"countries":{
"India":{
"cities":{
"Delhi ":{
"codes":["142","2243","312","4123","5132"]
},
"Calcutta":{
"codes":["1465","2465","3453","4132","542"]
}
}
},
"CHINA":{
"cities":{
"HONKKON":{
"codes":["1465","2465","3453","4132","542"]
}
}
}
}
}
}
}
我做了什么
getCodes(regions){
let ccode = [];
for (let key of Object.values(region)) {
for (let temp of Object.values(key)) {
for (let ctemp of Object.values(temp)) {
for (btemp of Object.values(ctemp)) {
for (let bbtemp of Object.values(btemp)) {
ccode.push(...bbtemp["code"])
}
}
}
}
}
}
但是,我所有的兴趣是收集每个区域的代码值并将它们放在一个列表中。有什么实用的方法吗?
解决方案
您可以使用这样的递归方法:
const extractCodes = obj => {
let codes = [];
for (const key in obj) {
if (key === 'codes') return [...obj[key]];
else {
codes = [...codes, ...extractCodes(obj[key])];
}
}
return codes;
};
const region = {
America: {
countries: {
US: {
cities: {
NY: {
codes: ['142', '2243', '312', '4123', '5132']
},
LA: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
},
CANADA: {
cities: {
TORNTO: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
}
}
},
ASIA: {
countries: {
India: {
cities: {
'Delhi ': {
codes: ['142', '2243', '312', '4123', '5132']
},
Calcutta: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
},
CHINA: {
cities: {
HONKKON: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
}
}
}
};
console.log(extractCodes(region));
如果您只想提取唯一值(不重复的代码),您可以使用Set
:
const extractCodes = obj => {
let codes = [];
for (const key in obj) {
if (key === 'codes') return [...obj[key]];
else {
codes = [...new Set([...codes, ...extractCodes(obj[key])])];
}
}
return codes;
};
const region = {
America: {
countries: {
US: {
cities: {
NY: {
codes: ['142', '2243', '312', '4123', '5132']
},
LA: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
},
CANADA: {
cities: {
TORNTO: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
}
}
},
ASIA: {
countries: {
India: {
cities: {
'Delhi ': {
codes: ['142', '2243', '312', '4123', '5132']
},
Calcutta: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
},
CHINA: {
cities: {
HONKKON: {
codes: ['1465', '2465', '3453', '4132', '542']
}
}
}
}
}
};
console.log(extractCodes(region));
推荐阅读
- python - 将重复值的键添加到列表 python
- python - 如何使用 python 自动化应用程序生命周期管理
- spring-boot - 带有@Profile 的控制器未加载
- sql - Ms Access - 显示两个查询结果之间的差异
- angular - Angular2/Ionic 5:如何避免在其某些子组件中显示带有路由器插座的工具栏?
- matplotlib - Matplotlib Colorbar 缺少 1 个必需的位置参数:'mappable'
- c - 在代码块中运行调试器时出现错误
- python - 在 python 中使用 fpdf 创建 pdf。无法循环向右移动图像
- r - 在 R 中为热图添加连续图例(首选基本 R,因为 ggplot 不起作用)
- php - Laravel Sail - 未找到 docker-compose.yml 文件,使用 WSL 2