Javascript 如何编写项目相互依赖的递归?
我想写一个函数,它返回一个人所依赖的人的列表。但是,人民依靠,反过来也可以依靠人民自己。例如:Javascript 如何编写项目相互依赖的递归?,javascript,node.js,arrays,recursion,reduce,Javascript,Node.js,Arrays,Recursion,Reduce,我想写一个函数,它返回一个人所依赖的人的列表。但是,人民依靠,反过来也可以依靠人民自己。例如: const people = { 'james': { reliesOn: [ 'gemma', 'jessica' ] }, jessica: { reliesOn: [ 'gemma', 'peter' ]
const people = {
'james': {
reliesOn: [
'gemma',
'jessica'
]
},
jessica: {
reliesOn: [
'gemma',
'peter'
]
},
peter: {
reliesOn: [
'james',
'gemma',
'jessica',
'ivon',
'jamie'
]
},
jamie: {
reliesOn: [
'ivon'
]
}
}
我试图用最简单的代码得到以下结果:
詹姆斯依靠的是:
杰玛,杰西卡,彼得,艾文,杰米
杰西卡依赖于:
杰玛,彼得,詹姆斯,艾文,杰米
彼得依赖于:
詹姆斯,杰玛,杰西卡,艾文,杰米
杰米依赖于:
伊万
如果已经有人问过,我会道歉。我从现实世界简化了这个例子,所以我希望它有意义我发现在递归时传递一个“memo”对象很有用,它跟踪我们已经到达的位置,以避免循环:
function *getDependenciesRecursive(people, person, alreadyVisited = new Set()) {
if (alreadyVisited.has(person)) {
return;
}
alreadyVisited.add(person);
if (!(person in people)) {
return;
}
for (const dependency of people[person].reliesOn) {
yield dependency;
yield* getDependenciesRecursive(people, dependency, alreadyVisited);
}
}
本质上,在这种方法中,Set
告诉我们跳过什么
const reliances = Object
.entries(people)
.reduce((results, [person, { reliesOn }]) => Object.assign(results, {
[person]: [...getDependenciesRecursive(people, person)]
}), {})
如果您确实想使用
reduce
执行此操作,则:
const getReliedOn=(人物,姓名)=>
[…(人物[姓名]?.reliesOn | |[]).reduce(功能重现)(acc,姓名){
返回科目有(名称)?科目
:(人物[姓名]?.reliesOn | |[]).reduce(复发,根据增加(姓名));
},新集合([名称])].slice(1);
//样本输入
康斯特人={'james':{reliesOn:['gemma','jessica']},jessica:{reliesOn:['gemma','peter']},peter:{reliesOn:['james','gemma','jessica','ivon','jamie']},jamie:{reliesOn:['ivon']};
//为每个人生产产量:
for(让name进入people)console.log(name,“=>”,…getReliedOn(people,name))代码>请包含您的代码。抱歉,我在回答问题后才看到此消息。但是我的代码乱七八糟,所以我没有把它发到最开始的地方。嗨@trincot,谢谢你的回复。如果我不需要使用reduce
,那么实现这一点最简单的代码是什么?抱歉,我发现这段代码很难理解抱歉如果问题的reduce
部分太过拘束,我将其从问题中删除。理想情况下,我想要最简单的代码来解决这个问题,我添加了一个替代解决方案,并添加了一些注释。如果您需要更多,请告诉我。非常感谢您,替代解决方案非常优雅且有效!我真的很感谢你的帮助@trincot!你好@jacob,谢谢你的帮助,但是当我运行这个时,我没有定义:console.log(getDependenciesRecursive(people,'james')代码>。我已经修改了代码,不使用生成器