我有一个如下所示的数据结构:
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
。但是,我感到愚蠢,坚持维持一系列父母。
答案 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";
}
}