javascript - 在嵌套对象数组中查找父对象。如何?

标签 javascript algorithm recursion data-structures

我有一个如下所示的数据结构:

var someDataStructure = [
  {
    opts: {_id:1}
  },
  {
    opts: {_id: 2},
    children: [
      {
        opts: {_id: 3},
        children: [
          {
            opts: {_id: 4}
          }
        ]
      }
    ]
  },
  {
    opts: {_id: 5}
  },
  {
    opts: {_id: 6},
    children: [
      {
        opts: {_id: 7},
        children: [
          {
            opts: {_id: 8}
          }
        ]
      }
    ]
  }  
];

这是一个对象数组,所有对象都具有一个opts 属性和一个可选的children 属性。如果它存在,children 属性将是同类对象的数组。

给定任何 opts._id,我需要找到所有父对象的 _id。我在这里给出的 _id 只是为了方便而顺序排列的。 您可能不会假设它们是连续整数

这个项目同时使用了 jquery 和 lodash,所以这两个库都可以使用。

示例所需的输出:

  • 给定4,返回[2, 3]
  • 给定3,返回[2]
  • 给定 8,返回 [6, 7]
  • 给定7,返回[6]

我可以毫无问题地递归并找到给定的 _id。但是,我觉得很愚蠢,坚持维护 parent 的数组。

最佳答案

如果找到,返回找到状态和 parent 的解决方案。

function getParentsHelper(tree, id, parents) {
    if (tree.opts._id == id) {
        return {
            found: true,
            parents: parents
        };
    }
    var result = {
        found: false,
    }
    if (tree.children) {
        $.each(tree.children, function(index, subtree) {
            var maybeParents = $.merge([], parents);
            if (tree.opts._id != undefined) {
                maybeParents.push(tree.opts._id);
            }
            var maybeResult = getParentsHelper(subtree, id, maybeParents);
            if (maybeResult.found) {
                result = maybeResult;
                return false;
            }
        });
    }
    return result;
}

function getParents(data, id) {
    var tree = {
        opts: { },
        children: data
    }
    return getParentsHelper(tree, id, []);
}

使用示例:

console.log(getParents(someDataStructure, 4).parents);
console.log(getParents(someDataStructure, 3).parents);
console.log(getParents(someDataStructure, 8).parents);
console.log(getParents(someDataStructure, 7).parents);

关于javascript - 在嵌套对象数组中查找父对象。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464912/

相关文章:

algorithm - 将元素随机放入N个桶中

java - 使用递归添加到变量

linux - Shell,For循环进入目录和子目录未按预期工作

c++ - 在有效地计算数组中第二个元素较少的对时,我哪里出错了?

javascript - 同一个网站分别使用Edge CSS3动画

显示站点 URL 的 Javascript 警报。如何从 javascript 警报顶部删除站点 url?

javascript - 模态窗口未关闭问题

javascript - Typeahead 和服务器端 onTextChanged 事件未正确同步

在范围内搜索的算法

java - 从两个数组中找到总和组合