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

如何用JS/Lodash遍历并修改深度未知的多维对象数组?

递归为嵌套对象数组添加subtitle属性的正确实现

你遇到的问题是递归逻辑没处理好,导致只能触达第一层节点。先看看你原代码里的问题:在处理子节点时,你用forEach遍历每个child,但递归调用时却传入了整个menu.children数组,这相当于重复处理同一层的子节点,根本没深入到下一层的嵌套结构里。

下面给你两种可行的修正方案:

方案一:直接修改原数组(原地更新)

这个方案会直接在原对象上添加subtitle属性,适合不需要保留原数据的场景:

static convertUrlsToSubTitles(treeData) {
  // 遍历当前层级的所有节点
  treeData.forEach(menu => {
    // 给当前节点添加subtitle,值和url一致
    menu.subtitle = menu.url;
    // 如果存在子节点数组,递归处理子节点
    if (menu.children && menu.children.length > 0) {
      SortableMenu.convertUrlsToSubTitles(menu.children);
    }
  });
  return treeData;
}

逻辑很直观:处理当前层的每个节点后,只要节点有子节点,就把子节点数组传入递归函数,逐层深入处理所有嵌套的节点。

方案二:返回新数组(无副作用)

如果你不想修改原数据,希望生成一个全新的结构,可以用map来创建新对象,避免影响原数组:

static convertUrlsToSubTitles(treeData) {
  return treeData.map(menu => {
    // 创建当前节点的副本,并添加subtitle
    const updatedMenu = {
      ...menu,
      subtitle: menu.url
    };
    // 如果有子节点,递归处理后替换原children
    if (menu.children && menu.children.length > 0) {
      updatedMenu.children = SortableMenu.convertUrlsToSubTitles(menu.children);
    }
    return updatedMenu;
  });
}

这个版本会生成全新的对象和数组,原数据不会被修改,更适合需要保持数据不可变性的场景。

测试一下这两个方案,不管你的菜单嵌套多少层,每个节点都会被添加上subtitle属性,完美解决深度不确定的问题。

内容的提问来源于stack exchange,提问作者i.brod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:48:17