使用JavaScript从嵌套JSON中提取所有link字段的实现方法
JavaScript 提取嵌套JSON中所有link字段实现方案
实现思路
针对你给出的顶层为动态键值对映射的JSON结构,提取逻辑分三步:
- 忽略顶层动态ID键名,直接遍历所有顶层条目值
- 按结构定位到存储link的
asset.market_actions数组路径,做空值兼容避免访问不存在的属性报错 - 遍历数组收集所有合法的link字段值
针对示例结构的直接实现
// 若输入是JSON字符串,先执行JSON.parse转为JS对象,若已经是对象可直接使用 const sourceData = typeof jsonInput === 'string' ? JSON.parse(jsonInput) : jsonInput; const linkList = []; // 遍历所有顶层条目 for (const entry of Object.values(sourceData)) { // 校验路径存在性,避免空值报错 if (entry.asset?.market_actions?.length) { for (const actionItem of entry.asset.market_actions) { if (actionItem.link) linkList.push(actionItem.link); } } }
运行上述代码处理你提供的示例数据,得到的linkList结果为:
[ "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20M%listingid%A%assetid%D2354938592644984102", "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20M%listingid%A%assetid%D9866835690490179400" ]
通用递归实现(无需提前知道link嵌套路径)
如果你不确定link字段的具体嵌套位置,需要从整个JSON中递归查找所有名为link的字段,可以使用下面的通用方法:
function getAllLinks(target, collectList = []) { // 处理数组类型 if (Array.isArray(target)) { target.forEach(item => getAllLinks(item, collectList)); return collectList; } // 处理对象类型 if (target && typeof target === 'object') { for (const [key, value] of Object.entries(target)) { if (key === 'link' && typeof value === 'string') { collectList.push(value); } getAllLinks(value, collectList); } } return collectList; } // 调用方式 const sourceData = typeof jsonInput === 'string' ? JSON.parse(jsonInput) : jsonInput; const linkList = getAllLinks(sourceData);
注意事项
- 代码中使用的
?.可选链操作符属于ES2020标准,如果需要兼容IE等老旧运行环境,可以替换为逐层非空判断,例如将entry.asset?.market_actions?.length改写为entry.asset && entry.asset.market_actions && entry.asset.market_actions.length - 不要直接对JSON字符串执行遍历操作,必须先通过
JSON.parse()转为原生JS对象后再处理
内容的提问来源于stack exchange,提问作者Seryozha Dryakhlov
相关产品推荐
相关产品推荐

