javascript - 从深层层次结构中检索具有给定属性的对象

标签 javascript

假设我有一个可以有子对象的层次结构。所有对象都有一个唯一的 id。我需要从这个层次结构中的任何地方检索一个对象,只给出 id。例如,层次结构可能如下所示:

var hierarchy = [
  {id: 1, children: [
    {id: 7},
    {id: 8}
  ]},
  {id: 2},
  {id: 3, children: [
    {id: 9},
    {id: 10, children: [
      {id: 11},
      {id: 12},
      {id: 13}
    ]}
  ]},
  {id: 4},
  {id: 5},
  {id: 6, children: [
    {id: 14}
  ]}
];

函数调用看起来像这样:

retrieveObjectById(10, hierarchy);
// => {id: 10, children: [...]}

我尝试使用 Array.filter 编写一个函数,该函数会在遇到元素的子元素时递归调用,但它也会返回祖先元素。

最佳答案

解决这些问题的想法通常是使用这样的递归函数:

function deepFind(obj, id) {
    if (obj.id==id) return obj;
    if (obj.children) {
       for (var i=0; i<obj.children.length; i++) {
           var o = deepFind(obj.children[i], id);
           if (o) return o;
       }
    }
}

由于您的根级对象没有相同的结构,您可以在 hierarchy 中循环或使其相似:

var myObject = deepFind({children:hierarchy}, 10);

Demonstration

关于javascript - 从深层层次结构中检索具有给定属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487426/

相关文章:

javascript - 如何从 URL 中提取 JSON?

javascript - 如何对我们的电话号码进行正则表达式验证而不以 0 或 1 开头?

javascript - 仅影响带有 JQuery 和 SLidedown() 函数的悬停 div 标记

javascript - Jquery this.height 无法正常工作

javascript - json的ajax响应限制是多少?

c# - 如果 Eval 不为空,如何有选择地在 GridView 中显示按钮?

javascript - 我正在尝试从 xhtml 文件动态提取 <h3> 元素并将它们放入选择列表中

javascript - 如何在 JS 确认消息中添加新行以在单击链接时显示?

javascript - Quickblox:消息已发送和阅读状态

javascript - jquery-获取最近的div的id?