Мой подход аналогичен подходу наортора, но с попыткой быть более обобщенным c.
const intersection = (pred) => (as, bs) =>
as .filter (a => bs .some (b => pred (a, b)))
const intersectionAll = (pred) => (xs) =>
xs.length ? xs .reduce (intersection (pred)) : []
const input = [[{id: 1}, {id: 2}, {id: 3}], [{id:6}, {id: 2}], [{id: 2}, {id: 1}, {id: 9}, {id: 3}]]
const eqIds = (a, b) => a .id == b .id
console .log (
intersectionAll (eqIds) (input)
)
.as-console-wrapper {min-height: 100% !important}
Эта версия требует, чтобы вы сказали, как вы идентифицируете два равных значения. (Мы проверим, имеют ли они одинаковый идентификатор, но разрешена любая двоичная функция предиката.) Эта функция передается в intersection
, которая возвращает функцию, которая принимает два массива и находит все общие элементы между этими двумя. intersectionAll
оборачивает это поведение, складывая intersection
по массиву массивов.
Эта разбивка полезна, поскольку intersection
также является полезной функцией. А абстракция проверки идентификатора в функцию, которую вы должны предоставить, означает, что эти функции гораздо более обобщенные c.