如何映射嵌套 object

How to map a nested object

我必须使用存储为 JSON object 的数据填充 li 元素。 使用“标题”,它的工作原理很简单。但这不是谈论名字的时候 值。如何映射子菜单 object 以获取名称?

    <ul>
      {data.map(({ title, subMenu }) => (
                <li className="mobileMenu-body-nav-item">
                    <button className="mobileMenu-body-nav-item-btn"> 
                 *** here I have to put name ***
                    </button>
                </li>
     ))}
    </ul>
         

JSON object

[
   {
    "title": "Breeds",
    "subMenu": [
        {
            "id": 1,
            "name": "Dog Breeds"
        },
        {
            "id": 2,
            "name": "Cat Breeds"
        }
    ]
  },
  {
    "title": "About Pet Adoption",
    "subMenu": [
        {
            "id": 3,
            "name": "About Dog Adoption"
        },
        {
            "id": 4,
            "name": "About Cat Adoption"
        }
      ]
   }
 ]

您可以再次调用 map,如下所示:

 <ul>
    {data.map(({ title, subMenu }) => (
        <li className="mobileMenu-body-nav-item">
            <button className="mobileMenu-body-nav-item-btn">
                {subMenu.map(({ name }) => (<span>{name}</span>))}
            </button>
        </li>
    ))}
</ul>

更改 <span> 标签以匹配您希望呈现此内容的方式。

此外,如果这是 React,请不要忘记在使用 map 时适当地 set the key prop:

<ul>
    {data.map(({ title, subMenu }) => (
        <li key={title} className="mobileMenu-body-nav-item">
            <button className="mobileMenu-body-nav-item-btn">
                {subMenu.map(({ name }) => (<div key={name}>{name}</div>))}
            </button>
        </li>
    ))}
</ul>

如对已接受答案的评论中所述,div 元素不是 buttons 的有效子元素(T.J.Crowder 的评论中的 related question) and while one should assign a key to mapped elements in React using the index of the iterated array is not always ideal. (see the Docs or related article)。

鉴于您正在映射一个嵌套列表,这样构建它似乎更合适。这里使用 title 作为外部 li 键(尽管更明确的唯一 属性 会更好)和 subMenu.id 作为内部 li 的键.

<ul>
  {data.map(({ title, subMenu }) => (
    <li key={title} className='mobileMenu-body-nav-item'>
      <ul>
        {subMenu.map(({ id, name }) => (
          <li key={id}>
            <button className='mobileMenu-body-nav-item-btn'>{name}</button>
          </li>
        ))}
      </ul>
    </li>
  ))}
</ul>