Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在构建导航时,如何避免嵌套循环?_Javascript_Jquery - Fatal编程技术网

Javascript 在构建导航时,如何避免嵌套循环?

Javascript 在构建导航时,如何避免嵌套循环?,javascript,jquery,Javascript,Jquery,我有一个JSON文件,用于存储导航面板(链接)的数据。简短版本如下: [ { "category": "Pages", "links": [ { "url": "#", "caption": "Account", "dropdown": [ { "ur

我有一个JSON文件,用于存储导航面板(链接)的数据。简短版本如下:

[
    {
        "category": "Pages",
        "links": [
            {
                "url": "#",
                "caption": "Account",
                "dropdown": [
                    {
                        "url": "profile.html",
                        "caption": "Profile"
                    },
                    {
                        "url": "edit-profile.html",
                        "caption": "Edit Profile"
                    }
                ]
            },
            {
                "url": "orders.html",
                "caption": "Orders"
            },
            {
                "url": "faq.html",
                "caption": "FAQ"
            }
        ]
    },
    ...
]
  for (var i = 0; i < data.length; i++) {
    ...
        for(var n = 0; n < data[i]["links"]; i++) {
            ...
            for(var k = 0; k < data[i]["links"][n]["dropdown"]; k++) {
                ...
            }
        }
   }
因此,当我使用jQuery为这些链接构建HTML代码时,我有3个嵌套的
for
循环:

  • 类别为1
  • 1用于该类别内的链接
  • 1查找可能的下拉链接
代码如下:

[
    {
        "category": "Pages",
        "links": [
            {
                "url": "#",
                "caption": "Account",
                "dropdown": [
                    {
                        "url": "profile.html",
                        "caption": "Profile"
                    },
                    {
                        "url": "edit-profile.html",
                        "caption": "Edit Profile"
                    }
                ]
            },
            {
                "url": "orders.html",
                "caption": "Orders"
            },
            {
                "url": "faq.html",
                "caption": "FAQ"
            }
        ]
    },
    ...
]
  for (var i = 0; i < data.length; i++) {
    ...
        for(var n = 0; n < data[i]["links"]; i++) {
            ...
            for(var k = 0; k < data[i]["links"][n]["dropdown"]; k++) {
                ...
            }
        }
   }
for(变量i=0;i
即使代码可以工作,我听说嵌套的
for
循环也不好(代码看起来也有点吓人)。有办法取代它吗?这种新方法会使代码运行更快吗?

假设您有:

  • 根数组中的“n”项
  • 根数组中每个项目的“m”链接,以及
  • 每个链接下拉列表中的“o”项
您当前的解决方案是
O(nmo)
。无论您如何重新编写代码,都无法优化您的时间复杂性。这是因为您绝对需要访问每个元素一次,而优化beyond
O(nmo)
意味着您跳过了一些元素

嵌套for循环是不好的

这有点笼统。更具体地说,当不需要嵌套for循环时,嵌套for循环是不好的。在你的情况下,它们是需要的


您可以重新编写以提高可读性等,但您现在正处于最佳案例性能。

有时,嵌套循环无法避免,除非跳过不必要的环。在这种情况下,您实际上必须一次处理一个键/值对,因此即使您确实找到了将其展平的方法,也不会实际减少工作。嵌套循环只有在导致不必要地多次命中同一数据段时才会出现问题。这看起来像是@J.Titus递归函数的作业。您可以创建一个递归算法来展平对象,然后在单个循环中使用展平的对象。嘿,我认为展平它需要更多的工作。首先,您必须迭代所有(或部分)键/值对以将其展平,然后必须循环展平的结构,从而两次命中某些(或全部)数据点。这是我想要看到的答案(无需重写代码)。谢谢