3

I want to filter over a collection of items with an eventual wildcard.

Let's say, I have the following items:

const items = ['Banana', 'Apple', 'Melon']

I now want to filter with the following strings:

e

Expected output: None

*e

Expected output: Apple

*e*

Expected output: Apple, Melon

ana

Expected output: None

*ana

Expected output: Banana

*an

Expected output: none

*an*

Expected output: Banana

I hope you get my intention. Is there any smart way to do it with regex or standard JS functions / libraries? I couldn't find something so far.

nsoeth
  • 371
  • 2
  • 5
  • 17
  • Reference Link : https://stackoverflow.com/questions/12695594/can-i-use-wildcards-when-searching-an-array-of-strings-in-javascript – Nareen Babu Sep 03 '18 at 05:16

1 Answers1

16

You can construct a regular expression by replacing *s with .* to match any characters, and surround the wildcard string with ^ and $ (to match the beginning and the end):

const items = ['Banana', 'Apple', 'Melon']

const filterBy = str => items.filter(
  item => new RegExp('^' + str.replace(/\*/g, '.*') + '$').test(item)
);
console.log(filterBy('e'));
console.log(filterBy('*e'));
console.log(filterBy('*e*'));
console.log(filterBy('ana'));
console.log(filterBy('*ana'));
console.log(filterBy('*an'));
console.log(filterBy('*an*'));

Note that if the wildcard string ever has any other characters with a special meaning in a regular expression, you'll have to escape them first.

CertainPerformance
  • 356,069
  • 52
  • 309
  • 320