Фильтр подстановки Массив объектов - Javascript - PullRequest
0 голосов
/ 14 февраля 2019

Как реализовать фильтр подстановочных знаков в массиве объектов?Даже если фильтр работает только с самого начала, это должно быть хорошо.Должна быть возможность фильтровать все свойства объекта.

Должен работать так же, как работает фильтр lodash, за исключением того факта, что фильтр подстановки также работает.Спасибо.

const sampleProducts = [{
    color: 'red',
    value: '#f00',
  },
  {
    color: 'green',
    value: '#0f0',
  },
  {
    color: 'blue',
    value: '#00f',
  },
  {
    color: 'cyan',
    value: '#0ff',
  },
  {
    color: 'magenta',
    value: '#f0f',
  },
  {
    color: 'yellow',
    value: '#ff0',
  },
  {
    color: 'black',
    value: '#000',
  },
];

const filteredResultsObj = {
  color: "red"
}

const filteredData = _.filter(sampleProducts, filteredResultsObj)

console.log(filteredData)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Я могу сделать только целое слово фильтр.Какой-нибудь совет по внедрению фильтра подстановочных знаков, подобного этому?

const sampleProducts = [{
    color: 'red',
    value: '#f00',
  },
  {
    color: 'green',
    value: '#0f0',
  },
  {
    color: 'blue',
    value: '#00f',
  },
  {
    color: 'cyan',
    value: '#0ff',
  },
  {
    color: 'magenta',
    value: '#f0f',
  },
  {
    color: 'yellow',
    value: '#ff0',
  },
  {
    color: 'black',
    value: '#000',
  },
];

const filteredResultsObj = {color: "bl", value: '#f0'}

		const filteredData = _.filter(sampleProducts, filteredResultsObj)
    
// [{color: 'blue', value: '#00f'}, {color: 'black', value: '#000'}, {
    color: 'red',
    value: '#f00',
  }, {
    color: 'magenta',
    value: '#f0f',
  }]

Данные должны фильтроваться только с самого начала, как в примере выше.Не должен фильтровать значения с bl в середине.Благодаря.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Одним из решений является использование функции , вызываемой на итерацию , и тестирование на регулярное выражение, соответствующее вашему покровителю.В этом случае регулярное выражение, которое совпадает с чем-то, начинающимся с bl:

const sampleProducts = [
  {color: 'red', value: '#f00'},
  {color: 'green', value: '#0f0'},
  {color: 'blue', value: '#00f'},
  {color: 'cyan', value: '#0ff'},
  {color: 'magenta', value: '#f0f'},
  {color: 'yellow', value: '#ff0'},
  {color: 'black', value: '#000'}
];

const regexp = /^bl/;

const filteredData = _.filter(sampleProducts, (o) => o.color.match(regexp));

console.log(filteredData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 14 февраля 2019

Возможно, вам придется использовать RegExp здесь.

const sampleProducts = [{
    color: 'red',
    value: '#f00',
  },
  {
    color: 'green',
    value: '#0f0',
  },
  {
    color: 'blue',
    value: '#00f',
  },
  {
    color: 'cyan',
    value: '#0ff',
  },
  {
    color: 'magenta',
    value: '#f0f',
  },
  {
    color: 'yellow',
    value: '#ff0',
  },
  {
    color: 'black',
    value: '#000',
  },
];

const filterByValue = (coll, value) =>
  _.filter(coll, _.flow(
    _.values,
    _.partialRight(_.some, _.method('match', new RegExp(value, 'i')))
  ));

console.log(filterByValue(sampleProducts, 'r'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 14 февраля 2019

Без использования lodash или подчеркивания, ваш вариант использования может быть обработан этим

const sampleProducts = [{
    color: 'red',
    value: '#f00',
  },
  {
    color: 'green',
    value: '#0f0',
  },
  {
    color: 'blue',
    value: '#00f',
  },
  {
    color: 'cyan',
    value: '#0ff',
  },
  {
    color: 'magenta',
    value: '#f0f',
  },
  {
    color: 'yellow',
    value: '#ff0',
  },
  {
    color: 'black',
    value: '#000',
  },
];

var strToMatch = 'bl';

var filtered = sampleProducts.filter(function(p) {
  var colorArray = p.color.split('');
  var colorToMatch = [];
  for(var i = 0; i < strToMatch.length; i++) {
    colorToMatch.push(colorArray[i]);
  }
  return strToMatch.toLowerCase() == colorToMatch.join('').toLowerCase()
})

console.log(filtered)
...