简体   繁体   English

Javascript - 从 json 创建父子导航

[英]Javascript - Create parent-child navigation from json

I'm trying to create navigation from json using parent child relation.我正在尝试使用父子关系从 json 创建导航。 My json looks like this.我的 json 看起来像这样。

Somehow I'm getting maximum callstack exceeded error message while printing the navigation不知何故,我在打印导航时收到了超出最大调用堆栈的错误消息

 [
  {
    "__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"
  }
]

I wrote a recursive function to loop through it, but somehow I'm getting maximum call stack exceeded error.我写了一个递归的 function 来循环它,但不知何故我得到了最大调用堆栈超出错误。 The code I'm using is:我正在使用的代码是:

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;
}

Any Idea where I'm making the mistake?知道我在哪里犯了错误吗?

Based on your code, I wrote a working version.根据您的代码,我编写了一个工作版本。 Please run the code snippet, and click the "Build Navigation" button to see if this is want you want.请运行代码片段,然后单击“构建导航”按钮,看看这是否是您想要的。

 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM