使用嵌套子级减少javascript数组

使用嵌套子级减少javascript数组,javascript,arrays,Javascript,Arrays,我正在尝试使用mongodb和graphql为网站创建帮助页面。 我为帮助页面创建了以下模式(joiGoose模式): constructor() { 常量joiSchema=joi.object ({ url:joi.string().required(), 标题:joi.string().required(), 内容:joi.string().required(), 子项:joi.array().items ( joi.string().meta({u mongoose:{type:“Obj

我正在尝试使用mongodb和graphql为网站创建帮助页面。 我为帮助页面创建了以下模式(joiGoose模式):

constructor()
{
常量joiSchema=joi.object
({
url:joi.string().required(),
标题:joi.string().required(),
内容:joi.string().required(),
子项:joi.array().items
(
joi.string().meta({u mongoose:{type:“ObjectId”,ref:“Help”})。可选(),
).meta({u mongoose:{u id:false,timestamps:false}),
已发布:joi.boolean().default(true).required(),
createdAt:joi.date().required().default(()=>moment()),
updatedAt:joi.date().required().default(()=>moment()),
});
const mongooseSchema=super(joigoose.convert(joiSchema));
返回猫鼬;
}
我想做的第一件事是给出帮助部分的摘要。我使用以下查询从mongodb获取所有页面:

const allHelpPages=wait MONGO.Help.find()`
它给了我一个包含所有帮助页面的数组。由于每个页面可以有多个嵌套的子页面(没有最高级别),所以我需要的是减少所有页面的子页面数组

示例:

const allPages=
[
{
id:1,
标题:测试1,
儿童:
[
2.
3.
]
},
{
id:2,
标题:测试2,
儿童:
[
4.
5.
]
}
{
id:3,
标题:测试3,
儿童:
[
6.
]
}
{
id:4,
标题:测试4
}
{
id:5,
标题:测试5
}
{
id:6,
标题:测试6,
儿童:
[
7.
]
}
{
id:7,
标题:测试7
}
]
应结束于:

[
{
id:1,
标题:测试1,
儿童:
[
{
id:2,
标题:测试2,
儿童:
[
{
id:4,
标题:测试4
},
{
id:5,
标题:测试5
}
]
},
{
id:3,
标题:测试3,
儿童:
[
{
id:6,
标题:测试6,
儿童:
[
{
id:7,
标题:测试7
}
]
}
]
}
]
},
]

您可以创建一个对象,用作查找表,其中键是对象的ID。然后基于该对象,您可以使用实际对象修改子数组,最后只需过滤掉其他对象的子对象

const data=[{“id”:1,“title”:“Test 1”,“children”:[2,3]},{“id”:2,“title”:“Test 2”,“children”:[4,5]},{“id”:3,“title”:“Test 3”,“children”:[6]},{“id”:4,“title”:“Test 4”},{“id”:5,“title”:“Test 5”},{“id”:6,“title”:“Test 6”,“children 7”}
const map={},isChild={}
for(让数据为零){
map[o.id]=o
}
const result=Object.entries(映射)
.map([k,v])=>{
const children=v.children;
if(children)children.forEach((id,i)=>{
isChild[id]=真
children[i]=map[id]
})
返回{…v,children}
})
.filter(({id})=>!isChild[id])

console.log(result)
到目前为止,您自己尝试过解决这个问题吗?const ordered=allPages.map(p=>{if(p.children&&p.childrence.length){const children=p.children.map(c=>{const index=allPages.findIndex(p=>p._id.toString()==c.toString());const-spliced=allPages.splice(索引,1);返回拼接[0];});p.children=children;}返回p;});迭代
所有页面
。对于每个“页面”,迭代
子项
。对于每个子项,获取
所有页面
中的相应条目,并将
子项
中的id替换为“页面”。删除“页面”从
allPages
id:6
是如何成为
id:3
的孩子的?也许可以清理一下你的Q代码中的两个对象。另外,你的Q有点笼统和混乱。不要把相关的东西放在评论->你的问题中。非常感谢。