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

如何使用map()遍历含嵌套对象数组的对象数组?

解决嵌套数组map遍历的undefined报错问题

错误根源很明确:部分对象没有subs属性,或是subs的值为undefined,这时直接调用map()自然会抛出Cannot read properties of undefined (reading 'map')异常。核心解决思路就是先确认subs是有效数组,再执行遍历,同时用递归处理多层嵌套结构。

以下是两种常见场景的实现代码:

1. React场景:递归列表组件

function NestedList({ items }) {
  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>
          {item.name}
          {/* 用可选链判断subs存在,且有元素才递归渲染子列表 */}
          {item.subs?.length > 0 && <NestedList items={item.subs} />}
        </li>
      ))}
    </ul>
  );
}

// 测试数据
const menuItems = [
  { id: 1, name: '首页' },
  { id: 2, name: '产品', subs: [
    { id: 21, name: '硬件' },
    { id: 22, name: '软件', subs: [{ id: 221, name: '移动端' }, { id: 222, name: 'PC端' }] }
  ] },
  { id: 3, name: '关于我们' }
];

// 直接在组件中使用即可
// <NestedList items={menuItems} />

这里用item.subs?.length > 0做双重判断:可选链?.会在subs不存在/为undefined时直接返回undefined,避免触发报错;同时只有子数组有内容时才渲染,避免生成空的ul标签。

2. 原生JavaScript:生成嵌套DOM列表

function createNestedList(items) {
  const ul = document.createElement('ul');
  
  items.forEach(item => {
    const li = document.createElement('li');
    li.textContent = item.name;
    
    // 严格判断subs是数组且有元素,再递归生成子列表
    if (Array.isArray(item.subs) && item.subs.length > 0) {
      li.appendChild(createNestedList(item.subs));
    }
    
    ul.appendChild(li);
  });
  
  return ul;
}

// 测试数据
const menuItems = [
  { id: 1, name: '首页' },
  { id: 2, name: '产品', subs: [
    { id: 21, name: '硬件' },
    { id: 22, name: '软件', subs: [{ id: 221, name: '移动端' }, { id: 222, name: 'PC端' }] }
  ] },
  { id: 3, name: '关于我们' }
];

// 插入到页面指定位置
document.body.appendChild(createNestedList(menuItems));

用Array.isArray(item.subs)精准判断是否为数组,再检查长度,彻底避免在非数组值上调用遍历方法的错误。

额外兜底技巧

如果你的数据中subs可能是null而非undefined,可以用空值合并操作符兜底,把非数组值转为空数组:

// 示例:即使item.subs是undefined或null,也能安全调用map
(item.subs ?? []).map(subItem => { /* 处理子项 */ })

内容的提问来源于stack exchange,提问作者Saqlen Mehdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 09:05:24