У меня есть очень простая функция, которая проверяет, пересекаются ли две линии. Сама функция пересечения работает, как и ожидалось, но когда я пытаюсь использовать ее во вложенных функциях 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.
Действительно, filter
всегда возвращает массив, который как объект является правдивым.
Правильное решение — не использовать .filter(…).length
для проверки соответствия некоторых элементов массива предикату, а использовать .some(…):
const intersectingLines: Line[] = poly1Lines.filter(poly1Line =>
poly2Lines.some(poly2Line =>
isIntersecting(poly1Line, poly2Line)
)
);