You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用递归循环提取嵌套数组中的所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:52:07