Массив, содержащий любую подстроку из другого массива?

#node.js

Вопрос:

У меня есть 2 массива следующего формата:

 array1 = ['cat', 'man', 'new']
array2 = ['catch', 'jim', 'manners', 'renew', 'newcomer']
 

Я пытаюсь найти массив, содержащий элементы массива 2, если какие-либо строки в массиве 1 содержатся в строке массива 2. В этом случае результат будет:
['catch', 'manners', 'renew', 'newcomer']
Я знаю, что мог бы сделать это с помощью forloop, но мне любопытно, есть ли для этого более простое решение в 1 строку?

Спасибо!

Ответ №1:

Вы можете использовать RegExp.test() и Array.join() для создания регулярного выражения с помощью чередования:

 const array1 = ['cat', 'man', 'new'];
const array2 = ['catch', 'jim', 'manners', 'renew', 'newcomer'];

const result = array2.filter(v => RegExp(array1.join('|')).test(v));

console.log(result); 

Примечания:

  • Вы должны быть осторожны, когда строки содержат специальные символы, их нужно будет экранировать.
  • С точки зрения производительности, лучше создать RegExp один раз, а не создавать его внутри filter() обратного вызова.

Ответ №2:

С filter() помощью , some() и includes() это можно сделать в одной строке:

 let array1 = ['cat', 'man', 'new'];
let array2 = ['catch', 'jim', 'manners', 'renew', 'newcomer'];

let ans = array2.filter(x => array1.some(a => x.includes(a)));

console.log(ans); 

Ответ №3:

 array1 = ['cat', 'man', 'new']
array2 = ['catch', 'jim', 'manners', 'renew', 'newcomer']

const result = array2.filter(word => array1.some(phrase => word.includes(phrase)))
console.log(result) 

Вы можете использовать фильтр() и некоторые()