如何使用递归循环提取嵌套数组中的所有fID值?
提取嵌套数组中所有fID值的递归实现
给定的嵌套数组
let detailsArray = [ { "foldername":"myfolder", "files":[ { "fID":"55", "name":"file51", }, ], "files":[ { "foldername":"mySubFolder", "forms":[ { "fID":"1111", "name":"file01", }, ], "folder":[ ] }, { "foldername":"mySubFolder02", "forms":[ { "fID":"4444", "name":"file02" }, ], "folder":[ ] }, ], }, { "foldername":"myfolder2", "files":[ ], "files":[ { "foldername":"mySubFolder2", "forms":[ { "fID":"2222", "name":"file03", }, ], "folder":[ ] }, { "foldername":"mySubFolder03", "forms":[ { "fID":"3333", "name":"file03" }, ], "folder":[ ] }, ], }, ]
需求说明
需要提取上述数组中所有的fID值,先后尝试两种方法均未成功,希望通过递归循环实现,预期输出:fids = ["55","1111","4444","2222","3333"]
尝试过的方法
方法一
let folder= detailsArray .map(el => el.folder); fids = folder.map(el => el.fID);
方法二
detailsArray.forEach(el =>{ if(el.folder.length > 0) allFormIds = el.folder.map(f => f.fID) })
递归解决方案
递归的核心是遍历所有可能包含fID的层级,以及所有嵌套结构(比如files、forms、folder数组),实现代码如下:
function extractFIDs(data) { let fids = []; const traverse = (item) => { // 处理数组类型,逐个遍历元素 if (Array.isArray(item)) { item.forEach(traverse); return; } // 提取当前对象的fID if (item.fID) { fids.push(item.fID); } // 递归遍历可能的嵌套数组 if (item.files) traverse(item.files); if (item.forms) traverse(item.forms); if (item.folder) traverse(item.folder); }; traverse(data); return fids; } // 调用函数获取结果 const fids = extractFIDs(detailsArray); console.log(fids); // 输出: ["55","1111","4444","2222","3333"]
代码说明
- 外层函数
extractFIDs维护存储结果的数组fids - 嵌套的
traverse函数负责遍历数据:- 若传入参数是数组,就逐个遍历数组元素
- 若传入参数是对象,先检查是否有
fID属性,有则加入结果数组 - 检查对象是否包含
files、forms、folder这些嵌套数组,存在则递归调用traverse
- 最后返回收集到的所有
fID值
内容的提问来源于stack exchange,提问作者janaka ravindra
相关产品推荐
相关产品推荐

