Коротка відповідь
middleФункція перетину двох масивів повертає новий масив, що містить лише елементи, які присутні в обох входних масивах. Приклад реалізації: `function intersection(a,b){const setB=new Set(b);return a.filter(x=>setB.has(x));}`
Повне пояснення
Що це і навіщо
Перетин масивів потрібен, коли треба знайти спільні значення двох колекцій – наприклад, у фільтрації користувачів за ролями.
Принцип роботи / алгоритм
- Створюємо
Setз елементів другого масиву – це забезпечує O(1) пошук. - Фільтруємо перший масив, залишаючи лише ті значення, що присутні у
Set.
Реалізація (JS / TS)
function intersection<T>(a: T[], b: T[]): T[] {
const setB = new Set(b);
return a.filter(v => setB.has(v));
}
Тестування
import { test, expect } from 'vitest';
test('intersection', () => {
expect(intersection([1,2,3], [2,3,4])).toEqual([2,3]);
});
Проблеми та edge cases
- Повторення – якщо потрібен унікальний результат, додайте
new Set(result). - Типи – при порівнянні об’єктів
Setвикористовує посилання, а не глибоке порівняння. - Пусті масиви – повертає
[]без помилок. - Нульові/undefined – вони також можуть бути елементами, якщо присутні в обох масивах.
- Великий розмір –
Setзберігає у пам’яті, тому для мільйонів елементів варто розглянути потокову обробку.
Оптимізація та продуктивність
- Якщо один масив значно менший, створюйте
Setз нього. - Для чисел можна використовувати
Int32Arrayабо бітові маски, але це обмежено типом.
Без JS / архітектурні альтернативи
У чистому HTML/CSS немає прямого способу обчислити перетин; можна використати IntersectionObserver для DOM-елементів, але це інша задача.
Cheatsheet + follow-up
- Ключ:
Setзабезпечує швидкий пошук. - Потенційне питання: Як обробити масиви з об’єктами, де порівняння має бути за ключем?