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')。我已经修改了代码,不使用生成器