1

我有一个应该返回列表的方法。我想通过两个参数而不是一个参数来过滤数据。到目前为止,我已经做了以下事情,但这是一个不想要的结果,所以我可能做错了什么

performFilterByRunnerName(
  filterByCompetition: string, filterByRunnerName: string
): IRunners[] {
return this.runners
  .filter(x => x.runnerName === filterByRunnerName)
  .filter(x => x.competitionId === filterByCompetition);
}
4

3 回答 3

3

使用&&运算符

performFilterByRunnerName(
  filterByCompetition: string, filterByRunnerName: string
): IRunners[] {
return this.runners
  .filter(x => x.runnerName === filterByRunnerName && x.competitionId === filterByCompetition);
}
于 2018-11-21T11:48:36.330 回答
1

很难从您的帖子中确切知道发生了什么。但我会试一试:

You have a function,
That accepts two values,
and returns an array,
that is first filtered by one value,
which is passed along the pipe,
and is then filtered by the other value.

这与“我正在用两个值过滤一个数组”不同,这意味着这两个过滤器是一个简单的“&&”。他们不是。我已经多次看到这种微妙(尽管很重要)的差异导致了一个问题。

一种非常简单的方法:您可以在一个过滤器内进行任意数量的比较。

performFilterByRunnerName(
  filterByCompetition: string, filterByRunnerName: string
): IRunners[] {
return this.runners
  .filter(x => ( x.runnerName === filterByRunnerName && x.competitionId === filterByCompetition ) );
}

如果您的最终游戏是“获取符合这两个标准的所有对象”,那么这应该可以预测。

于 2018-11-21T11:54:10.770 回答
1

依次执行两个过滤器意味着

  • 你得到第一组值
  • 在这个集合中,您创建了一组新的值

如果这不是您想要的,您可能应该解释您所期望的。

但要通知您,您有:

或者

.filter(x => x.runnerName === filterByRunnerName || x.competitionId === filterByCompetition);

.filter(x => x.runnerName === filterByRunnerName && x.competitionId === filterByCompetition);

异或

.filter(x => 
  (x.runnerName === filterByRunnerName && !(x.competitionId === filterByCompetition)) || 
  (!(x.runnerName === filterByRunnerName) && x.competitionId === filterByCompetition));
于 2018-11-21T11:48:58.740 回答