如何不使用多层map方法提取嵌套JSON中的数据及JSON结构访问问题
问题解答
问题1 嵌套数组拍平提取字段实现
方案1:使用flatMap实现(推荐)
flatMap是map+flat(1)的组合,会自动将每次遍历返回的数组拍平一层,多层嵌套场景连续使用即可直接得到一维数组:
const listActivity = data.activities // 第一层拍平:提取所有activity下的trackingProgress,合并为一维数组 .flatMap(activity => activity.trackingProgress) // 第二层拍平:提取所有trackingProgress下的items,合并为一维数组 .flatMap(progress => progress.items) // 提取目标字段 .map(item => item._id)
输出结果就是你需要的["610cb8ee541fea0009189c37", "6113583b0fea490008d56eae", "611b6068fed9100009a4f68a"]。
方案2:原有代码加flat拍平
如果不想修改原有嵌套map的写法,可以直接在最后调用flat方法,传Infinity表示将任意深度的嵌套数组全部拍平:
const listActivity = data.activities .map((item1) => item1.trackingProgress .map((item2) => item2.items .map((item3)=>(item3._id)))) .flat(Infinity)
问题2 JSON对象与数组的使用场景及嵌套数据提取优化
对象({})与数组([])的适用场景
- 对象:适用于存储异构的键值对集合,即每个字段的含义、类型均不相同,你明确知道要取的属性名,不需要批量遍历的场景,比如单条活动的title、type、reminderTimeAt这些属性就适合存在对象里,直接用
.操作符即可快速取值。 - 数组:适用于存储同类型的有序集合,所有元素结构/含义一致,需要批量遍历、排序、筛选的场景,比如多条活动记录、多条跟踪进度记录就适合存在数组里。
嵌套数组场景的优化提取方式
可以封装通用的深度提取工具函数,不用每次重复写多层遍历逻辑:
/** * 嵌套数组字段提取工具 * @param {Object} data 原始数据 * @param {Array} nestedPaths 嵌套数组的属性名路径,按层级顺序传入 * @param {String} targetField 要提取的目标字段名 * @returns {Array} 提取结果的一维数组 */ function extractNestedField(data, nestedPaths, targetField) { let result = [data] for (const path of nestedPaths) { result = result.flatMap(item => item[path]) } return result.map(item => item[targetField]) } // 调用示例 const itemIds = extractNestedField(data, ['activities', 'trackingProgress', 'items'], '_id')
后续遇到其他嵌套提取需求,只需要修改传入的路径和目标字段即可,不用重复编写嵌套遍历代码。
内容的提问来源于stack exchange,提问作者Lê Quốc Khánh
相关产品推荐
相关产品推荐

