Фильтровать массив объектов с помощью регулярных выражений - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть массив данных, как это:

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 data = [
  {Date: '2018010101', color: 'blue'},
  {Date: '2018010102', color: 'blue'},
  {Date: '2018010103', color: 'red'},
  {Date: '2018010104', color: 'green'},
]

поэтому я хочу отфильтровать массив и получить только те объекты с полем «Дата», которое содержит 20180101 * ».

как я могу это сделать? Я думаю, что я мог бы использовать lodash для фильтрации массива, но я не знаю, как установить регулярное выражение. Вот что я написал:

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

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Используйте Array.filter() с indexOf(), чтобы проверить ключ фильтра в значении Date:

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)
0 голосов
/ 02 ноября 2018

С Lodash есть несколько способов сделать это. Вы можете использовать фильтр , фильтр & соответствует , takeWhile и т. Д.

Вот несколько примеров:

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>

С ES6 вы можете просто:

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)

Я также добавил startsWith на всякий случай, поскольку из ваших примеров данных кажется, что regEx не совсем необходим, но вы, возможно, не предоставили все данные.

0 голосов
/ 02 ноября 2018

Вы можете сделать что-то подобное с помощью регулярных выражений. Здесь я выполняю фильтрацию по датам, в которых префикс 20180101 имеет суффикс:

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; }
...