【问题标题】:Nested array filter() functions in typescript - always returns true?打字稿中的嵌套数组过滤器()函数-总是返回true?
【发布时间】:2020-12-13 18:52:20
【问题描述】:

我有一个非常简单的函数来测试两条线是否相交。交集函数本身按预期工作,但是当我尝试在嵌套的 filter() 函数中使用它时,外部过滤器函数总是返回 true:

const intersectingLines: Line[] = poly1Lines.filter(poly1Line => {
    return poly2Lines.filter(poly2Line => {
        return (isIntersecting(poly1Line, poly2Line));
    });
});

我正在嵌套过滤器函数,以便我遍历第一个多边形测试中的所有线,如果它与第二个中的任何线相交(类似于在第一个数组上的外部循环的每次迭代中循环第二个数组)。

我怀疑这是因为第二个过滤器永远不会返回错误,所以我直接检查了过滤后数组的长度,其工作原理如下:

const intersectingLines: Line[] = poly1Lines.filter(poly1Line => {
    const filteredLines = poly2Lines.filter(poly2Line => {
        return (isIntersecting(poly1Line, poly2Line));
    });
    return (filteredLines.length > 0)
});

与简单地嵌套过滤器的返回相比,这感觉很hacky且可读性差。我确信我错误地嵌套了过滤器函数,但我几乎找不到有关如何执行此操作的文档。有没有比检查第二个过滤数组的长度更好的方法?

【问题讨论】:

  • 不是 "[]" 评估为真吗?所以内部过滤器总是真实的,因此外部过滤器中的所有元素都保持未过滤。
  • 是的,我怀疑这是问题所在,但 Nina Sholz 的回答表明嵌套过滤器调用是可能的,因此假设我一定做错了:stackoverflow.com/questions/38039311/…
  • @Harry 如果你仔细观察,你会发现它也使用了.some,以及@Bergi 的。顺便说一句,不要说“Nina Scholz 的答案”,您可以使用a link to the answer 下方的 分享 按钮。

标签: javascript typescript filter functional-programming


【解决方案1】:

确实,filter 总是返回一个数组,作为一个对象,它是真实的。

正确的解决方案不是使用.filter(…).length来检查某些数组元素是否匹配谓词,而是使用.some(…)

const intersectingLines: Line[] = poly1Lines.filter(poly1Line =>
    poly2Lines.some(poly2Line => 
        isIntersecting(poly1Line, poly2Line)
    )
);

【讨论】:

  • 谢谢,这比检查.length() 更有帮助,也更干净。在poly2Lines.some() 之前需要return 吗?
  • @Harry 不,因为它是一个箭头函数,并且在这种情况下省略大括号意味着returnfoo => {return bar}foo => bar 相同
猜你喜欢
  • 2020-05-02
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多