首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归未通过第一级

问递归未通过第一级
EN

Stack Overflow用户
提问于 2019-03-15 15:49:22
回答 1查看 39关注 0票数 0

我在JS中遇到了递归问题,我不确定为什么我的代码不会终止。我有一个mongoose模式,它遍历一系列法院,每个法院都有用户(然后我使用这些用户使用另一个模式搜索签名)。我想返回一个对象,其中所有用户从级别输入到最低级别。下面是我的代码:

代码语言:javascript
复制
    async function recurCourtUsers(username) {
        ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
          let level = courts.level;
          let courtName = courts.orgName.substring(0,2);
          let result = await searchModule.findCourt(courtName, level); // returns an object

          if (level === 4) {
            console.log('now at lvl4')
            console.log(result); 

          } else {
            level++
            var temp = await searchModule.findCourt(courtName, level);
            console.log(temp); 
            result.courts.concat(temp.courts);
            result.collections.concat(temp.collections);
            recurCourtUsers(courts.users[0].userName);
          }          
        });
      }
      recurCourtUsers(req.body.username);

我不认为searchModule.findCourt()中有任何错误,因为它只是找到法院并获得签名,返回一个看起来像这样的对象

代码语言:javascript
复制
{
  courts: [{courtObjects}] //array of court Objects
  collection: [] //array of users that have signatures
}

// a courtObject looks like this:

{
   _id: objectId,
   orgName: "NY court"
   level: 3 // there are up to 4 levels, 1 being the "highest" or start
   users: [{userName: "15z", displayName: "court2"}]
}

我的问题是,如果我从2级开始,这个函数会打印出所有3级球场。我想打印从第二级开始的所有法庭(存储在result变量中),然后转到第三级,最后转到第四级。但是这个函数只是停留在下一级,并且在一次递归后似乎永远不会增加level变量。另外,我应该返回任何东西(比如result变量)吗?我应该使用累加器来代替吗?

有什么建议吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-15 16:51:06

我会试着解释我的理论,让我知道它是否有意义:

在这里,我注释掉了不影响递归调用的每一行:

代码语言:javascript
复制
async function recurCourtUsers(username) {
    ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
      let level = courts.level;
      // let courtName = courts.orgName.substring(0,2);
      // let result = await searchModule.findCourt(courtName, level); // returns an object

      if (level === 4) {
        console.log('now at lvl4')
        console.log(result); 

      } else {
        // level++
        // var temp = await searchModule.findCourt(courtName, level);
        // console.log(temp); 
        // result.courts.concat(temp.courts);
        // result.collections.concat(temp.collections);
        recurCourtUsers(courts.users[0].userName);
      }          
    });
}
recurCourtUsers(req.body.username);

为了清楚起见,让我删除它们:

代码语言:javascript
复制
async function recurCourtUsers(username) {
    ContactSchema.findOne({'users': {$elemMatch: {userName: username}}}).lean().then(async function(courts) {
      let level = courts.level;

      if (level === 4) {
        console.log('now at lvl4')
        console.log(result); 
      } else {
        recurCourtUsers(courts.users[0].userName);
      }          
    });
}
recurCourtUsers(req.body.username);

如果您注意到这一点,您似乎正在使用您在法庭上找到的第一个使用该用户用户名的用户。这让我想到,当你再次调用这个方法时:courts.users[0].userName === req.body.username。

这可能就是让你陷入无限循环的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55177870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档