Функции вложенного массива filter() в машинописном тексте - всегда возвращает true?

У меня есть очень простая функция, которая проверяет, пересекаются ли две линии. Сама функция пересечения работает, как и ожидалось, но когда я пытаюсь использовать ее во вложенных функциях 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)
});

Это кажется хакерским и менее читаемым, чем простое вложение результатов фильтров. Я убежден, что неправильно вставляю функции фильтра, но я нахожу мало документации о том, как это сделать. Есть ли лучший способ сделать это, чем проверка длины второго отфильтрованного массива?

🤔 А знаете ли вы, что...
JavaScript позволяет создавать мобильные приложения для iOS и Android с использованием фреймворков, таких как React Native и NativeScript.


381
1

Ответ:

Решено

Действительно, filter всегда возвращает массив, который как объект является правдивым.

Правильное решение — не использовать .filter(…).length для проверки соответствия некоторых элементов массива предикату, а использовать .some(…):

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