Javascript - 从 json 创建父子导航

标签 javascript html json recursion navigation

我正在尝试使用父子关系从 json 创建导航。我的 json 看起来像这样。

不知何故,我在打印导航时收到超出最大调用堆栈的错误消息

 [
  {
    "__type": "Service+Menu",
    "ID": 1,
    "Caption": "Master",
    "URL": "",
    "Description": "Main menu",
    "ParentID": ""
  },
  {
    "__type": "Service+Menu",
    "ID": 2,
    "Caption": "Branch Details",
    "URL": "~/UI/Masters/Branch_Details.aspx",
    "Description": "Branch Details",
    "ParentID": "1"
  },
  {
    "__type": "Service+Menu",
    "ID": 123,
    "Caption": "Bank Details",
    "URL": "",
    "Description": "Bank Details",
    "ParentID": "1"
  },
  {
    "__type": "Service+Menu",
    "ID": 124,
    "Caption": "Bank Details Entry",
    "URL": "~/UI/Loans/BankEntryRectification.aspx",
    "Description": "Bank Details Entry",
    "ParentID": "123"
  },
  {
    "__type": "Service+Menu",
    "ID": 10,
    "Caption": "Loans&Printing",
    "URL": "",
    "Description": "",
    "ParentID": ""
  },
  {
    "__type": "Service+Menu",
    "ID": 11,
    "Caption": "Loan Form Request",
    "URL": "~/UI/Masters/LoanFormRequest.aspx?Type=General",
    "Description": "Loan Form Request",
    "ParentID": "10"
  }
]

我编写了一个递归函数来循环它,但不知何故我收到了最大调用堆栈超出错误。我正在使用的代码是:

console.log(buildNavigation(data));

function buildNavigation(items, parent = '') {
  var next = function (items, parent) {
    return items.filter(function (item) {
      return (item.ParentID == parent);
    })
  }

  var output = '<ul>';

  for (var key in next(items, parent)) {
    output += '<li>';
    output += '<a href="#">' + items[key].Caption + '</a>';

    if (next(items, items[key].ID)) {
      output += buildNavigation(next(items, items[key].ID), parent);
    }

    output += '</li>';
  }

  output += '</ul>';

  return output;
}

知道我在哪里犯了错误吗?

最佳答案

根据您的代码,我编写了一个工作版本。请运行代码片段,然后单击“构建导航”按钮以查看这是否是您想要的。

var data = [
  {
    "__type": "Service+Menu",
    "ID": 1,
    "Caption": "Master",
    "URL": "",
    "Description": "Main menu",
    "ParentID": ""
  },
  {
    "__type": "Service+Menu",
    "ID": 2,
    "Caption": "Branch Details",
    "URL": "~/UI/Masters/Branch_Details.aspx",
    "Description": "Branch Details",
    "ParentID": "1"
  },
  {
    "__type": "Service+Menu",
    "ID": 123,
    "Caption": "Bank Details",
    "URL": "",
    "Description": "Bank Details",
    "ParentID": "1"
  },
  {
    "__type": "Service+Menu",
    "ID": 124,
    "Caption": "Bank Details Entry",
    "URL": "~/UI/Loans/BankEntryRectification.aspx",
    "Description": "Bank Details Entry",
    "ParentID": "123"
  },
  {
    "__type": "Service+Menu",
    "ID": 10,
    "Caption": "Loans&Printing",
    "URL": "",
    "Description": "",
    "ParentID": ""
  },
  {
    "__type": "Service+Menu",
    "ID": 11,
    "Caption": "Loan Form Request",
    "URL": "~/UI/Masters/LoanFormRequest.aspx?Type=General",
    "Description": "Loan Form Request",
    "ParentID": "10"
  }
]

function buildNavigation(items, parent = '') {
  var next = function (items, parent) {
    return items.filter(function (item) {
      return (item.ParentID == parent);
    })
  }

  var output = '<ul>';
  
  var subItems = next(items, parent)
  for (var key in subItems) {
    output += '<li>';
    output += '<a href="#">' + subItems[key].Caption + '</a>';
    var subItems2 = next(items, subItems[key].ID)
    if (subItems2) {
      output += buildNavigation(items, subItems[key].ID);
    }

    output += '</li>';
  }

  output += '</ul>';

  return output;
}

document.querySelector('#build').onclick = function() {
  document.querySelector('#result').innerHTML = buildNavigation(data)
}
<button id="build">Build Navigation</button>
<div id="result"></div> 

关于Javascript - 从 json 创建父子导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58310308/

相关文章:

javascript - 在 mongodb 中一次插入 2 个集合中的大数据

javascript - JS/CSS - 保持 td 元素的宽度

jquery - 使用 JQuery 单击功能更改 CSS 代码

javascript - 如何在javascript中将两个json数据添加在一起

javascript - 带有gmail api的 Node js,API返回错误: Error: unauthorized_client

json - 如何在不使用 Newtonsoft.JSON 的情况下序列化/反序列化

javascript - 从 React Context API 渲染函数中的 map 函数渲染 HTML

javascript - D3.js 和 jQuery - 多个 map 点和点击事件

javascript - 低连接 window.location.href

javascript - 内联代码在 asp 上不起作用 :Button