Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 带递归函数的if语句_Angular_Typescript_If Statement_Recursion - Fatal编程技术网

Angular 带递归函数的if语句

Angular 带递归函数的if语句,angular,typescript,if-statement,recursion,Angular,Typescript,If Statement,Recursion,我是一个初学者,我被阻塞了,我有一个调用递归函数的测试,在这个函数执行后,根据它的返回值我们进行处理,函数返回true,返回false后,即使条件有效,它仍保持在循环true false中,真假。如何停止执行的功能,一旦我有真,我正在尝试,但需要帮助,有人能告诉我在正确的方向请 if(路由长度){ 如果(此验证(路由)){ 返回true; } 否则{ this.location.back(); } } 验证(列表:路由[]){ 对于(列表中的x){ if(this.router.url==x.

我是一个初学者,我被阻塞了,我有一个调用递归函数的测试,在这个函数执行后,根据它的返回值我们进行处理,函数返回true,返回false后,即使条件有效,它仍保持在循环true false中,真假。如何停止执行的功能,一旦我有真,我正在尝试,但需要帮助,有人能告诉我在正确的方向请

if(路由长度){
如果(此验证(路由)){
返回true;
} 
否则{
this.location.back();
}
}
验证(列表:路由[]){
对于(列表中的x){
if(this.router.url==x.path){
返回true;
}else if(x.menu.length!==0){
返回此。验证(x.menu);
} 
}
返回false;
}

您可以做一些改进:

  • number=>布尔转换的工作原理是,如果number为0,则为false,否则为true。所以你可以只做
    if(x.menu.length)
    ,因为如果length为0,它将为false(与length!==0完全相同)
另外,我将重写递归函数,如下所示:

Validate(list: Route[]): string[] {
  function getPaths(route: Route): string[] {
    let pathArr = [];
    if (route.menu) {
      pathArr = getPaths(route.menu);
    };
    pathArr.push(route.path);

    return pathArr;
  }

  const pathList = list.reduce((pList, route) => {
    return [...pList, ...getPaths(route)];
  }, []);

  return pathList.indexOf(this.router.url) > -1;
}
如果您希望在达到true后立即停止函数的执行,那么您可以对此做出响应,我可以考虑其他一些事情


PS:未经测试直接写在SO上,可能是错误或其他原因,请让我知道

执行简单操作:仅在接收结果为真时停止循环,否则继续检查循环的下一个元素,直到结束

 if (ROUTES.length) {
  if(this.Validate(ROUTES)){
     return true;
  } 
  else {
    this.location.back();
  }
}


Validate(list: Route[]) {    
  for (let x of list) {
    if (this.router.url === x.path) {
      return true;
    } else if (x.menu.length !== 0) {

      const result = this.Validates(x.menu);

      //**** return once got true
      if(result){ 
        return true;
      }

    }

  }

  return false;

}

这个路径是什么?验证函数返回一个未赋值的布尔值。也许这就是错误?我认为您应该将第一个if条件更改为
if(this.Validate(ROUTES)){…}
I change但是如果(ROUTES.length!==0){if(this.Validate(ROUTES)){return true;}否则{this.location.back();}这个函数的目的是什么?我真的不明白。例如,如果<代码>或者如果<代码>没有达到一次,您基本上总是将最后一次迭代作为结果值(因为路径变量在每个周期都被重新分配),您可以尝试更改<代码>返回此值。验证(x.menu)使用<代码>此。验证(x.menu);中断validate函数用于浏览嵌套的JSON对象,如果URL==path,则返回true;如果存在子对象,则递归返回;否则返回false;另一个测试应用程序路由的函数调用此函数,如果验证有效,则返回true,否则退出循环返回falseERROR错误:未捕获(承诺中):RangeError:超出最大调用堆栈大小RangeError:在GetPath处超出最大调用堆栈大小(函数GetPath(route:route):string[]),我认为错误:超过最大调用堆栈大小意味着您在某个地方有一个无限循环是的,可能是在reduce的返回中。如果将其更改为
pList.push(getpath(route));返回层它会消失吗?如果有用,请接受答案。