【问题标题】:Map and display multiple Array inside an object - Reactjs在一个对象内映射和显示多个数组 - Reactjs
【发布时间】:2018-12-19 10:46:15
【问题描述】:

我有一个嵌套的 JSON 文件以创建下拉大型菜单级别,我不知道如何映射和渲染多个级别的数组和对象以创建树状结构。

以下是我的 JSON 结构:

{
  "megamenu": [
    {
      "name": "level1.1",
      "link": "#"
    },
    {
      "name": "level1.2",
      "link": "#",
      "level1.2.1": {
        "A": [
          {
            "name": "A-one",
            "link": "#"
          }
        ],
        "B": [
          {
            "name": "B-one",
            "link": "#"
          }
        ]
      }
    },
    {
      "name": "level1.3",
      "link": "#",
      "children": [
        {
          "name": "level1.3.1",
          "link": "#",
          "children": [
            {
              "name": "level1.3.1.1",
              "link": "#"
            }
          ]
        },
        {
          "name": "level1.3.1.2",
          "link": "#",
          "children": [
            {
              "name": "level1.3.1.2",
              "link": "#"
            }
          ]
        }
      ]
    }
  ]
}

我可以像这样映射第一级:

let menuArray = [];
let menu = this.props.menu.megamenu
console.log(menu);
for (let key in menu) {
    menuArray.push(menu[key]);
    return (
        <section>
            <ul>
                {this.props.menu.megamenu.map((menuitem, index) = > (
                <div key={index}>
                    <li>{menuitem.name}</li>
                    </div>
                    ))}
            </ul>
        </section>
    );
}

但想映射所有级别并显示如下结构:

<ul>
    <li>Level1.1
    <li>
    <li>Level1.2
        <div className="dropdown">
            <ul>
                <li>A</li>
                <li>B</li>
            </ul>
            <ul>
                <li>A-one</li>
                <li>b-one</li>
            </ul>
        </div>

    </li>
</ul>
<li>
<li>Level1.3
    <div className="dropdown">
        <div className="col">
            <h2>level1.3.1</h2>
            <ul>
                <li>level1.3.1.1</li>
            </ul>
        </div>
        <div className="col">
            <h2>level1.3.2</h2>
            <ul>
                <li>level1.3.1.2</li>
            </ul>
        </div>
    </div>

</li>
<ul>

我已尝试详细解释以便更好地理解,任何帮助将不胜感激。

【问题讨论】:

  • 你应该编写一个递归函数来编写不确定的深度层次结构。
  • 什么是level1.2.1?应该是孩子
  • 另外,你的结构看起来不一致,因为有时你有钥匙有时你有孩子,你需要先改变你的结构。
  • @AmerllicA : 你有这个递归函数的任何样本/示例吗?
  • @Justcode :是的,这种结构不一致,但这是我从 API 得到的,只有 JSON 的这一部分具有不同的结构。 { "name": "level1.2","link": "#","level1.2.1": { "A": [ { "name": "A-one", "link": "#" } ], "B": [{"name": "B-one", "link": "#" }], } },

标签: javascript arrays json reactjs ecmascript-6


【解决方案1】:

正如您将结构更改为这样的东西,

{
  "megamenu": [
    {
      "name": "level1.1",
      "link": "#"
    },
    {
      "name": "level1.2",
      "link": "#",
      "children": [
        {
          "name": "A-one",
          "link": "#"
        },
        {
          "name": "B-one",
          "link": "#"
        }
      ]
    },
    {
      "name": "level1.3",
      "link": "#",
      "children": [
        {
          "name": "level1.3.1",
          "link": "#",
          "children": [
            {
              "name": "level1.3.1.1",
              "link": "#"
            }
          ]
        },
        {
          "name": "level1.3.1.2",
          "link": "#",
          "children": [
            {
              "name": "level1.3.1.2",
              "link": "#"
            }
          ]
        }
      ]
    }
  ]
}

这很明显,因为在子对象中添加新键是错误的方式,现在,您需要一个递归函数来处理这个问题,可能是这样的

  getData = (menu) => {

    return <div>
      <li>{menu.name}</li>
      {(menu.children !== undefined && menu.children.length > 0) && <ul>{

        menu.children.map(data => {
          return this.getData(data);
        })
      }
      </ul>}
    </div>
  }

在渲染内部你可以更改为这个

 return (
      <section>
        <ul>
          {data.megamenu.map((menuitem, index) => (
            this.getData(menuitem)
          ))}
        </ul>
      </section>
    );

所以,我们所做的是调用递归函数getdata

这里是demo

【讨论】:

  • 感谢您创建演示,但为什么 menu.children.children 未定义,我正在尝试像这样访问此数组。 console.log (menu.children.children); 但我收到以下错误 TypeError: Cannot read property 'children' of undefined
  • @H.Husain 它是未定义的,因为 children 是一个数组而不是对象,您需要通过 menu.children[0].children 访问它
  • 我试图访问这个但同样的错误,看看这就是我想要做的return &lt;li className={menu.children. !== undefined &amp;&amp; menu.children.length &gt; 0 ? 'nav-item ddfull subnav' : 'nav-item'}&gt;如果level1在孩子中有孩子,则需要应用不同的类所以当它不起作用时我这样访问return &lt;li className={menu.children.children !== undefined &amp;&amp; menu.children.children.length &gt; 0 ? 'nav-item ddfull subnav' : 'nav-item'}&gt;
  • 有什么解决办法吗?
  • @H.Husain 为它创建 stackblitz 我会看看
猜你喜欢
  • 2018-12-04
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2021-07-06
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多