user10381316
user10381316

Reputation:

Filter array of objects using regex

I have an array of data like this:

const data = [
  {Date: '2018010101', color: 'blue'},
  {Date: '2018010102', color: 'blue'},
  {Date: '2018010103', color: 'red'},
  {Date: '2018010104', color: 'green'},
  {Date: '2018010202', color: 'red'},
  {Date: '2018010301', color: 'yellow'},
  {Date: '2018010204', color: 'green'},
  {Date: '2018010305', color: 'blue'},
  {Date: '2018010206', color: 'green'},
]

now I want to get an array of this type:

const data = [
  {Date: '2018010101', color: 'blue'},
  {Date: '2018010102', color: 'blue'},
  {Date: '2018010103', color: 'red'},
  {Date: '2018010104', color: 'green'},
]

so I want to filter the array and get only those objects with “Date” field that contains 20180101*”.

how can I do? I think I could use lodash to filter the array but I don't know how to set the regex. This is what I wrote:

const filterBy = { 'Date': '20180101*' }
const filteredData = filter(data, filterBy)

Upvotes: 2

Views: 2863

Answers (3)

Akrion
Akrion

Reputation: 18525

With Lodash there are more than one way to do this. You can use filter, filter & conforms, takeWhile etc.

Here are some examples:

const data = [ {Date: '2018010101', color: 'blue'}, {Date: '2018010102', color: 'blue'}, {Date: '2018010103', color: 'red'}, {Date: '2018010104', color: 'green'}, {Date: '2018010202', color: 'red'}, {Date: '2018010301', color: 'yellow'}, {Date: '2018010204', color: 'green'}, {Date: '2018010305', color: 'blue'}, {Date: '2018010206', color: 'green'}, ]

const regEx = /20180101/g
const ld1 = _.filter(data, ({Date}) => !!Date.match(regEx))
const ld2 = _.filter(data, _.conforms({ 'Date': d => d.match(regEx) }))
const ld3 = _.takeWhile(data, ({Date}) => !!Date.match(regEx))

console.log('filter', ld1)
console.log('filter & conforms', ld2)
console.log('takeWhile', ld3)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

With ES6 you could just:

const data = [ {Date: '2018010101', color: 'blue'}, {Date: '2018010102', color: 'blue'}, {Date: '2018010103', color: 'red'}, {Date: '2018010104', color: 'green'}, {Date: '2018010202', color: 'red'}, {Date: '2018010301', color: 'yellow'}, {Date: '2018010204', color: 'green'}, {Date: '2018010305', color: 'blue'}, {Date: '2018010206', color: 'green'}, ]

const regEx = /20180101/g
const es61 = data.filter(({Date}) => !!Date.match(regEx))
const es62 = data.filter(({Date}) => Date.startsWith('20180101')) // just in case

console.log('filter', es61)
console.log('startsWith', es62)

I also added the startsWith just in case since from your sample data it seems regEx is not exactly needed but you might have not provided all the data.

Upvotes: 1

Ankit Agarwal
Ankit Agarwal

Reputation: 30739

Use Array.filter() with indexOf() to check that filter key in the Date value:

const data = [
  {Date: '2018010101', color: 'blue'},
  {Date: '2018010102', color: 'blue'},
  {Date: '2018010103', color: 'red'},
  {Date: '2018010104', color: 'green'},
  {Date: '2018010202', color: 'red'},
  {Date: '2018010301', color: 'yellow'},
  {Date: '2018010204', color: 'green'},
  {Date: '2018010305', color: 'blue'},
  {Date: '2018010206', color: 'green'},
];
let filterKey = '20180101';
const res = data.filter(item => item.Date.indexOf(filterKey) === 0);
console.log(res)

Upvotes: -1

Nick Parsons
Nick Parsons

Reputation: 50854

You can do something like this with regex. Here I am filtering based on the dates which have 20180101 as a prefix with anything following as a suffix:

const data = [  {Date: '2018010101', color: 'blue'},  {Date: '2018010102', color: 'blue'},  {Date: '2018010103', color: 'red'},  {Date: '2018010104', color: 'green'},  {Date: '2018010202', color: 'red'},  {Date: '2018010301', color: 'yellow'},  {Date: '2018010204', color: 'green'},  {Date: '2018010305', color: 'blue'},  {Date: '2018010206', color: 'green'}],
      res = data.filter(({Date}) => Date.match(/20180101./g));

console.log(res);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Upvotes: 3

Related Questions