我正在努力建立一个家庭树,可能有无限级别的父母和孩子。我也想找到兄弟,姐妹,表兄弟等等,当数据只给每个人的父母时,我对Javascript中构建数组的方法感到有点困惑。
在名为"用户"的MongoDB集合中我有以下条目
{ id: 1, name: "Target", parents: [3,4] }
{ id: 2, name: "Wife" }
{ id: 3, name: "Dad", parents: [5,6] }
{ id: 4, name: "Mom" }
{ id: 5, name: "Dads Dad", parents: [7,8] }
{ id: 6, name: "Dads Mom" }
{ id: 7, name: "Dads Dads Dad", parents: 9 }
{ id: 8, name: "Dads Dads Mom" }
{ id: 9, name: "Dads Dads Dads Dad" }
{ id: 10, name: "Son", parents: [1, 2] }
{ id: 11, name: "Sons Son", parents: [10] }
{ id: 12, name: "Sons Sons Son", parents: [11] }
{ id: 13, name: "Brother", parents: [3,4] }
{ id: 14, name: "Brothers Son", parents: [13] }
{ id: 15, name: "Uncle", parents: [5,6] }
{ id: 16, name: "Aunt", parents: [5,6] }
{ id: 17, name: "Daughter", parents: [5,6] }
我可以轻松地使用id循环每个孩子并输出它,但它不会给孩子的子结构只是循环和输出。
getChildren = function(id) {
var children = Users.find({parents: id});
children.forEach(function(child) {
console.log(child);
getChildren(child.id);
});
};
我一直在尝试创建两个全局变量ascendants
和descendants
,以便我可以循环父母,祖父母等,并将他们的孩子和孩子的孩子窝在里面(兄弟们)然后是侄子等)。然后与后代相似。由于有多个巢并且必须能够在另一个条目中添加条目,因此这变得很复杂。
希望有人可以帮我构建这个。所以我可以获得可以构建到HTML / CSS系列树中的东西。为了得到非孩子/父母,我可能需要有条件地再次循环?
descendents = {
10: { // son
11: { // grandson
12: {} // great grandson
}
},
17: { // daughter
}
}
答案 0 :(得分:2)
使用您当前的结构并稍微修改您的实现,您可以找到给定id
的父级和给定parent id
的子级。
让root为保存输出结构的变量:
var root = {};
查找所有后代的递归函数:
var getDescendants = function(id,root) {
var children = Users.find({parents: id});
children.forEach(function(child) {
root[child.id] = {"name":child.name};
getChildren(child.id,root[child.id]);
});
};
getDescendants (3,root);
样本o / p:
> root
{
"1" : {
"10" : {
"11" : {
"12" : {
"name" : "Sons Sons Son"
},
"name" : "Sons Son"
},
"name" : "Son"
},
"name" : "Target"
},
"13" : {
"14" : {
"name" : "Brothers Son"
},
"name" : "Brother"
}
}
查找所有祖先的递归函数。
var getAscendants = function(id,root) {
var rec = Users.findOne({id: id});
if(rec.hasOwnProperty("parents")){
(rec["parents"]).forEach(function(parent) {
root[parent] = {};
getAscendants(parent,root[parent]);
});
}
};
var root = {};
getAscendants(12,root);
为了得到非孩子/父母,我可能需要有条件 再次循环
是。您可以使用$nin
运算符。