打字稿中的嵌套循环

Nested looping in typescript

我在返回语句的函数中循环遍历嵌套数组时遇到问题。

  selectInputFilter(enteredText, filter) {
    if (this.searchType === 3) {
      return (enteredText['actors'][0]['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
    } 
  }

所以基本上我不想手动指向 [actors] 的 [0] 元素,而是想在点处遍历数组的所有元素。但是我不知道如何在这样的返回函数中嵌入循环。我尝试了 forEach,但我的 VSCode 抛出错误。

我需要嵌套的完整管道是 below.So 基本上我不能在最后一个 else 语句中包含循环。最重要的是,此时代码看起来有点像意大利面条,因此欢迎任何简化建议。

export class InputFilterPipe implements PipeTransform{

  searchType: number;
  private subscription: Subscription;

  constructor(private movieService: MovieService) {
    this.movieService.getSearchType().subscribe(
      id => this.searchType = id
    );
  }


      transform(value: any[], filter: string): any[] {
        filter = filter ? filter.toLocaleLowerCase() : null;
        return filter ? value.filter(
          (arraySearched) =>
            this.selectInputFilter(arraySearched, filter))
             : value;
      }

      selectInputFilter(arraySearched, filter) {
        if (this.searchType === 3) {
          const values = [];
          for (let actor of arraySearched['actors']) {
           values.push(actor['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
            for (let i = 0; i < values.length; i++ ) {
              if (values[i] === true) {
                return (arraySearched['actors'][i]['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
              }
            }
          }
      } else if (this.searchType === 2) {
          return (arraySearched['director'].toLocaleLowerCase().indexOf(filter) !== -1);
        } else if (this.searchType === 1) {
          return (arraySearched['title'].toLocaleLowerCase().indexOf(filter) !== -1);
        } else {
          return  (arraySearched['title'].toLocaleLowerCase().indexOf(filter) !== -1) ||
          (arraySearched['director'].toLocaleLowerCase().indexOf(filter) !== -1) ||
            (arraySearched['actors'][0]['surname'].toLocaleLowerCase().indexOf(filter) !== -1) ||
            (arraySearched['actors'][1]['surname'].toLocaleLowerCase().indexOf(filter) !== -1) || 
            (arraySearched['actors'][2]['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
            // (arraySearched['actors'][3]['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
      }
    }

你可以制作一个生成器函数,像这样:

function* selectInputFilter(enteredText, filter) {
  if (this.searchType === 3) {
    for (var actor of enteredText['actors']) {
      yield actor['surname'].toLocaleLowerCase().indexOf(filter) !== -1;
    }
  }
}

并像这样使用它:

for (var x of selectInputFilter(/*your args here*/)) {
  // x will loop over each of the "returned" values
}

或者,您可以制作一个 return 所需值的数组,如下所示:

function selectInputFilter(enteredText, filter) {
  if (this.searchType === 3) {
    var values = [];
    for (var actor of enteredText['actors']) {
      values.push(actor['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
    }
    return values;
  }
}

编辑:

对于后一种情况,您可以使用 Array.prototype.some,就像这样

} else {
  return (arraySearched['title'].toLocaleLowerCase().indexOf(filter) !== -1) ||
      (arraySearched['director'].toLocaleLowerCase().indexOf(filter) !== -1) ||
      (arraySearched['actors'].some((actor) => actor['surname'].toLocaleLowerCase().indexOf(filter) !== -1));
}

或者只使用这样的变量:

} else {
  let returnValue = (arraySearched['title'].toLocaleLowerCase().indexOf(filter) !== -1) ||
      (arraySearched['director'].toLocaleLowerCase().indexOf(filter) !== -1);
  for (let actor of arraySearched['actors']) {
    if (returnValue) break; // so it doesn't keep looping after returnValue is true
    returnValue = returnValue || actor['surname'].toLocaleLowerCase().indexOf(filter) !== -1);
  }
  return returnValue;
}