Reputation:
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
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
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
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