Фильтровать список строк, если ключевое слово совпадает с другим списком, используя Ramda
У меня есть список URL-адресов, которые были возвращены из API:
const data = [
'/shoutouts',
'/shoutouts/shoutout',
'/news/news-story',
'/example-page',
'/another-page',
'/stories/what-s-next',
'/metrics',
'/links',
'/links/sprint',
'/quick-links',
'/quick-links/confluence'
]
И у меня есть несколько категорий, по которым я бы хотел отфильтровать свои URL:
const filters = [
'news',
'shoutouts',
'quick-links',
'metrics',
'links'
]
Я хотел бы оставить только те URL-адреса, которые содержат название категории. Например, если один из URL-адресов содержит links
или же news
Мы хотели бы сохранить это.
Это (не работающая) идея кода, которую я имею до сих пор.
const containsFilter = (filter, data) => R.contains(filter, data)
const filtered = R.map(filter => {
return R.filter(containsFilter(filter, data))
}, filters)
Как я могу адаптировать это более чисто /ramda-esque способ отфильтровать мой список URL?
2 ответа
Решение
Вы можете использовать следующее:
const filtered = R.filter(url => {
return R.any((filter) => {
return R.contains(filter, url);
}, filters);
}, data);
Решение с простым JS:
const filtered = data.reduce((res, curr) => filters.some(f => curr.includes(f)) ? res.concat(curr) : res, [])