Фильтровать массив объектов по нескольким значениям - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу иметь возможность создавать новый массив объектов путем фильтрации одного по нескольким поисковым запросам

Пример:

  const arr = [
  {
      'city': 'Atlanta',
      'state': 'Georgia'
  },
  {
      'city': 'Chicago',
      'state': 'Illinois'
  },
  {
      'city': 'Miami',
      'state': 'Florida'
  }
]

const searchTerms = ['Georgia', 'Florida']

Я хотел бы иметь возможность фильтровать его следующим образом:

arr.filter(obj => obj['state'].includes(searchTerms))

Я обнаружил, что ввод одной строки с .include работает, но не массив.Я открыт для другой логики или даже сторонней библиотеки вроде lodash или чего-то еще.Я хотел бы вернуть новый массив объектов только с состояниями, которые есть в массиве searchterms

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018

Если вы заинтересованы в решении с использованием Ramda :

const cities = [
  { 'city': 'Atlanta',
    'state': 'Georgia' },
    
  { 'city': 'Chicago',
    'state': 'Illinois' },
    
  { 'city': 'Miami',
    'state': 'Florida' } ];
    

const findCities = (search, cities) => {
  const predicate = R.flip(R.includes)(search);
  return R.filter(R.compose(predicate, R.prop('state')), cities);
};

console.log(
  findCities(['Georgia', 'Florida'], cities)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
0 голосов
/ 02 декабря 2018

Другой подход, который вы можете использовать здесь, это использовать Map, который будет иметь согласованное время поиска:

const arr = [ { 'city': 'Atlanta', 'state': 'Georgia' }, { 'city': 'Chicago', 'state': 'Illinois' }, { 'city': 'Miami', 'state': 'Florida' } ] 
const searchTerms = ['Georgia', 'Florida']

const searchMap = arr.reduce((r,c) => (r.set(c.state, c),r), new Map())

console.log(searchTerms.map(x => searchMap.get(x)))
0 голосов
/ 02 декабря 2018

Вы должны позвонить searchTerms.includes на obj.state, а не наоборот.Таким образом, это становится:

let result = arr.filter(obj => searchTerms.includes(obj.state));

Что означает фильтр из объектов, которые имеют их state свойство , включенное в массив searchItems.

Пример:

const arr = [{'city': 'Atlanta', 'state': 'Georgia'}, {'city': 'Chicago', 'state': 'Illinois'}, {'city': 'Miami', 'state': 'Florida'}];

const searchTerms = ['Georgia', 'Florida'];

let result = arr.filter(obj => searchTerms.includes(obj.state));

console.log(result);
...