在嵌套的对象数组中查找父对象。怎么样?

时间:2014-12-13 23:54:37

标签: 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。但是,我感到愚蠢,坚持维持一系列父母。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

对于一个孩子,这是有效的:

function writeParent(id, arr) {

    var ct = 0;
    var found = false;
    var parentsLine = []; 

    arr.some(function (e){
        parentsLine = []

        for (var curr = e; curr.children != null; curr = curr.children[0]) {
            if (id == curr.opts._id) {
                found = true;
                return true;
            } 
            parentsLine.push(curr.opts._id)    

        }  

        if (id == curr.opts._id) {
            found = true;
            return true;
        } 


    })
    if (found) {
        return parentsLine;
    } else {
        return "ERR: elm not found";
    }    
}

请参阅http://jsfiddle.net/alemarch/ufrLpLfx/11/