Для реализации некоторых алгоритмов необходимо уметь вычислять пересечение или дифференцирование наборов данных. В JavaScript операция может быть легко реализована с помощью метода filter() и concat().
Содержание
Пересечение множеств в JavaScript
Пересечение двух множеств – это элементы, которые встречаются в обоих векторах. На рисунке ниже область выделена синим цветом.
Простейшая реализация этой операции может быть выполнена путем фильтрации элементов первого множества, которые также находятся во втором. Это можно сделать с помощью метода filter(), как показано ниже.
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const intersection = arr1.filter(x => arr2.includes(x)); // [3, 4]
Code language: JavaScript (javascript)
Разность множеств в JavaScript
Разность двух множеств – это элементы одного из них, которых нет в другом. Графически это можно увидеть на следующем рисунке.
Как и в предыдущем случае, эта операция может быть легко реализована на JavaScript с помощью метода filter(). Выбор всех элементов первого множества, которые не входят во второе.
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const difference = arr1.filter(x => !arr2.includes(x)); // [1, 2]
Code language: JavaScript (javascript)
Это можно аналогично применить и ко второму набору.
Симметричная разность множеств в JavaScript
Наконец, симметричная разность – это все элементы обоих множеств минус их пересечение. Именно эти элементы находятся в зонах, выделенных синим цветом на следующем графике.
Это может быть достигнуто простым объединением элементов разницы между первым и вторым множествами.
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const difference1 = arr1.filter(x => !arr2.includes(x)); // [1, 2]
const difference2 = arr2.filter(x => !arr1.includes(x)); // [5, 6]
const symmetric = difference1.concat(difference2); // [1, 2, 5, 6]
Code language: JavaScript (javascript)
Или, без необходимости хранить значения в двух промежуточных переменных, это также может быть сделано следующим образом.
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const symmetric = arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x)));
Code language: JavaScript (javascript)
Заключение
Мы увидели, как метод filter() можно использовать для получения простым способом пересечения и разности векторов в JavaScript.