Если вы беспокоитесь о производительности, вам нужно использовать структуру данных, которая обеспечивает хорошее время поиска.Методы массива, такие как Array.prototype.indexOf
, Array.prototype.includes
и Array.prototype.find
, имеют линейный поиск.Map
имеет двоичный поиск и Set
имеет постоянный поиск.Я думаю, что Set
будет идеальным в этой ситуации.
Простая реализация intersection
-
const intersection = (a1 = [], a2 = []) =>
{ const s =
new Set(a1)
const result =
[]
for (const x of a2)
if (s.has(x))
result.push(x)
return result
}
console.log(intersection(['a', 'b'], ['b', 'c']))
// [ 'b' ]
Это можно немного упростить, используя функции высшего порядка, такие как Array.prototype.filter
-
const intersection = (a1 = [], a2 = []) =>
{ const s =
new Set(a1)
return a2.filter(x => s.has(x))
}
console.log(intersection(['a', 'b'], ['b', 'c']))
// [ 'b' ]
Эта концепция может быть расширена для поддержки пересечения произвольного числа массивов -
const intersection = (a1 = [], a2 = []) =>
{ const s =
new Set(a1)
return a2.filter(x => s.has(x))
}
const intersectAll = (a = [], ...more) =>
more.reduce(intersection, a)
console.log(intersectAll(['a', 'b'], ['b', 'c'], ['b', 'd'], ['e', 'b']))
// [ 'b' ]