javascript - JSON对象中的递归数据
问题描述
{
"groups": [
{
"name": "Event",
"groups": [
{
"name": "Service",
"subscriptions": [
{
"topic": "SERVICE_STATUS_PRESETS"
},
{
"topic": "AIRCRAFT_ACTIVATION",
},
{
"topic": "OUT_OF_SERVICE",
}
]
}
]
},
{
"name": "Enquiries",
"groups": [
{
"name": "Service-related",
"subscriptions": [
{
"topic": "PROMO_CODES_REQUESTS",
}
]
}
]
}
],
"subscriptions": [
{
"topic": "BANNERS",
},
{
"topic": "DOCUMENTS",
},
{
"topic": "USER",
}
]
}
好的,伙计们,我有这样的 JSON 结构,我需要的是:返回数组中的所有主题,在这个例子中它将是:
[“SERVICE_STATUS_PRESETS”、“AIRCRAFT_ACTIVATION”、“OUT_OF_SERVICE”、“PROMO_CODES_REQUESTS”、“BANNERS”、“DOCUMENTS”、“USER”]
我尝试这样的递归调用,虽然我只得到最后三个记录:
getRecursive() {
if (Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
if (data[i].subscriptions) {
return data[i].subscriptions.map((val: SubscriptionGroupDetails) => val.topic);
} else if (data[i].groups) {
return this.getAllTopics(data[i].groups);
}
}
}
if (data && data.groups) {
return this.getAllTopics(data.groups);
}
return data.subscriptions.map((val: SubscriptionGroupDetails) => val.topic);
}
解决方案
您可以采用递归方法并检查
- 如果传递的数据不是检查对象,则返回空数组,
- 如果对象具有想要的属性,则返回一个值为 的数组
topic
, - 或获取值并使用函数进行递归调用并返回一个包含结果的数组。
function getTopics(object) {
if (!object || typeof object !== 'object') return [];
if ('topic' in object) return [object.topic];
return Object.values(object).reduce((r, v) => [...r, ...getTopics(v)], []);
}
var data = { groups: [{ name: "Event", groups: [{ name: "Service", subscriptions: [{ topic: "SERVICE_STATUS_PRESETS" }, { topic: "AIRCRAFT_ACTIVATION" }, { topic: "OUT_OF_SERVICE" }] }] }, { name: "Enquiries", groups: [{ name: "Service-related", subscriptions: [{ topic: "PROMO_CODES_REQUESTS" }] }] }], subscriptions: [{ topic: "BANNERS" }, { topic: "DOCUMENTS" }, { topic: "USER" }] },
result = getTopics(data);
console.log(result);
推荐阅读
- python - 字符串清理
- xml - Google 表格 ImportXML XPath 返回 #N/A
- powershell - 退出“拖尾”文件的 Get-Content 命令的 Powershell 脚本
- javascript - 如何在反应中实现平滑的响应视差效果?
- javascript - 是否有事件或方法可以知道 Chrome 扩展程序何时在“扩展程序”页面中打开或关闭?
- python - 如何摆脱字符串列表中的单词
- reactjs - 如何配置响应以使用 npm-watch 监视 css 文件的更改
- python - 将系列放置到给定数组
- vue.js - 重用现有组件
标签 - mongodb - Mongo DB聚合按数组字段排序,选择前三个记录并将其他记录合并为一个